質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Google マップ

Google Mapは、Google社がオンラインで提供している地図・ローカル検索サービスです。GIS(Geographic Information System:地理情報システム)の中の「WebGIS」に該当します。地図・航空写真・地形の表示方式があり、それぞれユーザーが縮尺を調整して表示させることができます。地域の情報サービスを検索する機能やルート検索の機能も搭載されています。

Q&A

解決済

1回答

1685閲覧

【Android】CSVを非同期処理して座標を埋め込んだら1つしかマーカーが出なくなった

amiamia

総合スコア13

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Google マップ

Google Mapは、Google社がオンラインで提供している地図・ローカル検索サービスです。GIS(Geographic Information System:地理情報システム)の中の「WebGIS」に該当します。地図・航空写真・地形の表示方式があり、それぞれユーザーが縮尺を調整して表示させることができます。地域の情報サービスを検索する機能やルート検索の機能も搭載されています。

0グッド

1クリップ

投稿2018/01/18 17:27

前回、メインスレッドで緯度経度の入ったcsvファイルを読み込んでgooglemap上に座標を埋め込むことができたのですが、
重かったので,HandleThreadを使って別スレッドで読み込もうとしたら何故かマーカーが一つしか出なくなってしまいました。
HandlerThreadを読み込んで

// CSVの読み込みとマーカー設置.処理が重いので別スレッドで実行. HandlerThread handlerThread = new HandlerThread("AddMarker"); handlerThread.start(); Handler handler = new Handler(handlerThread.getLooper()); handler.post(new Runnable() { @Override public void run() { // AssetManagerの呼び出し AssetManager assetManager = getResources().getAssets(); try { // CSVファイルの読み込み InputStream is = assetManager.open("hoge.csv"); InputStreamReader inputStreamReader = new InputStreamReader(is); BufferedReader bufferReader = new BufferedReader(inputStreamReader); String line = ""; while ((line = bufferReader.readLine()) != null) { mMain.mDblLatitude = Double.parseDouble(line.split(",")[0]); mMain.mDblLongitude = Double.parseDouble(line.split(",")[1]); // UIスレッドでマーカー設置. getCsvHandler.sendEmptyMessage(1); } bufferReader.close(); } catch (IOException e) { e.printStackTrace(); System.out.println("ダメやで"); } } });

下のコードをメインスレッドで呼び出しています。

@SuppressLint("HandlerLeak") Handler getCsvHandler = new Handler(){ public void handleMessage(Message msg) { addMarker(); } }; public void addMarker() { if (mMap != null) { // 表示したマップにマーカーを追加する. mMap.addMarker(new MarkerOptions().position( new LatLng(mMain.mDblLatitude, mMain.mDblLongitude)) .icon(BitmapDescriptorFactory.fromBitmap(resizeMapIcons("book", 200,200)))); } }

悩んでいるのですがよくわかりません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

おそらくUIスレッドの処理が走るまでにcsvを最後まで読み切ってしまっているのではないでしょうか。mMain.mDblLatitudemMain.mDblLongitudeという変数は「1つ」しかなく、csvの行が進むたびに上書き更新されています。getCsvHandler.sendEmptyMessage(1);を呼び出した「瞬間」にaddMarkerが実行されるわけではないので、addMarkerが呼ばれるまでにmDblLatitudemDblLongitudeが上書きされてしまえば、それまでに読み込んでいたデータは全て「なかったこと」になります。
読み込んだデータをList等に入れて、addMarkerはそのListから順次読み出していくべきではないでしょうか。

Java

1// mMainのクラスにList<double>型のdataという変数を用意したものとします 2private List<double> data = new ArrayList<>();

Java

1while ((line = bufferReader.readLine()) != null) { 2 String[] values = line.split(","); 3 synchronized(mMain.data) { // addMarker処理と同期を取る 4 mMain.data.add(Double.parseDouble(values[0])); 5 mMain.data.add(Double.parseDouble(values[1])); 6 } 7 // UIスレッドでマーカー設置. 8 getCsvHandler.sendEmptyMessage(1); 9} 10

Java

1public void addMarker() { 2 if (mMap != null) { 3 // 表示したマップにマーカーを追加する. 4 synchronized(mMain.data) { // csv読み込み処理と同期を取る 5 while(!mMain.data.isEmpty()) { // すでに読み込まれているデータが尽きるまで繰り返す 6 7 // dataの先頭2個のデータをlat,lngとして読み込む 8 double lat = mMain.data.remove(0); 9 double lng = mMain.data.remove(0); 10 11 mMap.addMarker(new MarkerOptions().position(new LatLng(lat, lng)) 12 .icon(BitmapDescriptorFactory.fromBitmap(resizeMapIcons("book", 200,200)))); 13 } 14 } 15 } 16}

投稿2018/01/19 02:09

編集2018/01/23 00:01
masaya_ohashi

総合スコア9206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amiamia

2018/01/22 02:50

ご回答ありがとうございます。ご指摘通りにやったら以下のエラーが出ました。 FATAL EXCEPTION: AddMarker Process: com.example, PID: 10758 java.lang.NullPointerException: Null reference used for synchronization (monitor-enter) どうやらsynchronizedでエラーをはいているようです。。。 ちなみに下のサイトを参考にして作っていました。 http://mslgt.hatenablog.com/entry/2015/05/22/011431
masaya_ohashi

2018/01/22 23:59

それ、変数dataにnewでArrayListなどを入れてありますか?あなたの技術力が不明だったので省略して書いたのですが、どうやらそこも書かなければならなかったようですね…
amiamia

2018/01/24 17:36

すいません、理解しました。 とても助かりました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問