ファイルから座標を読み込み、非同期タスクでマップに図形を追加したいと考えています。しかし、エラーが発生し、その理由がわかりません。これが私のコードです:
private class shpLoading extends AsyncTask<GoogleMap, Void, String> {
ProgressDialog dialog;
@Override
protected String doInBackground(GoogleMap... params) {
ShpReader shpRead = new ShpReader();
GoogleMap map = params[0];
try {
shpRead.reading();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidShapeFileException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for(LatLng a : shpRead.points())
map.addMarker(new MarkerOptions()
.position(a)
.draggable(false));
int i = 0;
for(List<LatLng> a: shpRead.lines()){
map.addPolyline(new PolylineOptions()
.addAll(a)
.width(3)
.color(Color.RED));
}
for(List<LatLng> a: shpRead.polygons()){
map.addPolygon(new PolygonOptions()
.addAll(a)
.strokeWidth(3)
.strokeColor(Color.RED)
.fillColor(0x3F00FF00));
}
return "Done";
}
@Override
protected void onPreExecute() {
dialog = new ProgressDialog(Measuring.this);
dialog.setMessage("Kraunama...");
dialog.setIndeterminate(true);
dialog.setCancelable(false);
dialog.show();
}
@Override
protected void onProgressUpdate(Void... values) {
}
@Override
protected void onPostExecute(String result) {
dialog.dismiss();
}
}
そして、これは私がコードを実行する方法です:
shpLoading load = new shpLoading();
load.execute(mMap);
mMap は GoogleMap 変数です。doInBackground
すべてのコードをonPostExecute
メソッドに追加し、変数map
をグローバルに変更すると、すべてmMap
が機能しますが、このタスクをバックグラウンドで実行し、同時に読み込みダイアログを表示したいと考えています。
これが私のLogCatです:
08-26 11:10:52.368: E/AndroidRuntime(11099): FATAL EXCEPTION:
AsyncTask #1
08-26 11:10:52.368: E/AndroidRuntime(11099):
java.lang.RuntimeException: An error occured while executing
doInBackground()
08-26 11:10:52.368: E/AndroidRuntime(11099): at
android.os.AsyncTask$3.done(AsyncTask.java:299) 08-26 11:10:52.368:
E/AndroidRuntime(11099): at
java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
08-26 11:10:52.368: E/AndroidRuntime(11099): at
java.util.concurrent.FutureTask.setException(FutureTask.java:124)
08-26 11:10:52.368: E/AndroidRuntime(11099): at
java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
08-26 11:10:52.368: E/AndroidRuntime(11099): at
java.util.concurrent.FutureTask.run(FutureTask.java:137) 08-26
11:10:52.368: E/AndroidRuntime(11099): at
android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 08-26
11:10:52.368: E/AndroidRuntime(11099): at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
08-26 11:10:52.368: E/AndroidRuntime(11099): at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
08-26 11:10:52.368: E/AndroidRuntime(11099): at
java.lang.Thread.run(Thread.java:856) 08-26 11:10:52.368:
E/AndroidRuntime(11099): Caused by: java.lang.IllegalStateException:
Not on the main thread 08-26 11:10:52.368: E/AndroidRuntime(11099):
at maps.ar.p.b(Unknown Source) 08-26 11:10:52.368:
E/AndroidRuntime(11099): at maps.al.g.b(Unknown Source) 08-26
11:10:52.368: E/AndroidRuntime(11099): at maps.ag.an.a(Unknown
Source) 08-26 11:10:52.368: E/AndroidRuntime(11099): at
bkw.onTransact(SourceFile:137) 08-26 11:10:52.368:
E/AndroidRuntime(11099): at
android.os.Binder.transact(Binder.java:326) 08-26 11:10:52.368:
E/AndroidRuntime(11099): at
com.google.android.gms.maps.internal.IGoogleMapDelegate$a$a.addPolyline(Unknown
Source) 08-26 11:10:52.368: E/AndroidRuntime(11099): at
com.google.android.gms.maps.GoogleMap.addPolyline(Unknown Source)
08-26 11:10:52.368: E/AndroidRuntime(11099): at
com.es.map.Measuring$shpLoading.doInBackground(Measuring.java:1165)
08-26 11:10:52.368: E/AndroidRuntime(11099): at
com.es.map.Measuring$shpLoading.doInBackground(Measuring.java:1) 08-26
11:10:52.368: E/AndroidRuntime(11099): at
android.os.AsyncTask$2.call(AsyncTask.java:287) 08-26 11:10:52.368:
E/AndroidRuntime(11099): at
java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
08-26 11:10:52.368: E/AndroidRuntime(11099): ... 5 more 08-26
11:11:00.453: E/WindowManager(11099): Activity com.es.map.Measuring
has leaked window
com.android.internal.policy.impl.PhoneWindow$DecorView@42229e30 that
was originally added here 08-26 11:11:00.453: E/WindowManager(11099):
android.view.WindowLeaked: Activity com.es.map.Measuring has leaked
window com.android.internal.policy.impl.PhoneWindow$DecorView@42229e30
that was originally added here 08-26 11:11:00.453:
E/WindowManager(11099): at
android.view.ViewRootImpl.<init(ViewRootImpl.java:403) 08-26
11:11:00.453: E/WindowManager(11099): at
android.view.WindowManagerImpl.addView(WindowManagerImpl.java:311)
08-26 11:11:00.453: E/WindowManager(11099): at
android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224)
08-26 11:11:00.453: E/WindowManager(11099): at
android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149)
08-26 11:11:00.453: E/WindowManager(11099): at
android.view.Window$LocalWindowManager.addView(Window.java:554) 08-26
11:11:00.453: E/WindowManager(11099): at
android.app.Dialog.show(Dialog.java:277) 08-26 11:11:00.453:
E/WindowManager(11099): at
com.es.map.Measuring$shpLoading.onPreExecute(Measuring.java:1195)
08-26 11:11:00.453: E/WindowManager(11099): at
android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586) 08-26
11:11:00.453: E/WindowManager(11099): at
android.os.AsyncTask.execute(AsyncTask.java:534) 08-26 11:11:00.453:
E/WindowManager(11099): at
com.es.map.Measuring.onOptionsItemSelected(Measuring.java:566) 08-26
11:11:00.453: E/WindowManager(11099): at
android.app.Activity.onMenuItemSelected(Activity.java:2629) 08-26
11:11:00.453: E/WindowManager(11099): at
android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:366)
08-26 11:11:00.453: E/WindowManager(11099): at
com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java)
08-26 11:11:00.453: E/WindowManager(11099): at
com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735)
08-26 11:11:00.453: E/WindowManager(11099): at
com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:149)
08-26 11:11:00.453: E/WindowManager(11099): at
com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874)
08-26 11:11:00.453: E/WindowManager(11099): at
com.android.internal.view.menu.IconMenuView.invokeItem(IconMenuView.java:468)
08-26 11:11:00.453: E/WindowManager(11099): at
com.android.internal.view.menu.IconMenuItemView.performClick(IconMenuItemView.java:126)
08-26 11:11:00.453: E/WindowManager(11099): at
android.view.View$PerformClick.run(View.java:17298) 08-26
11:11:00.453: E/WindowManager(11099): at
android.os.Handler.handleCallback(Handler.java:615) 08-26
11:11:00.453: E/WindowManager(11099): at
android.os.Handler.dispatchMessage(Handler.java:92) 08-26
11:11:00.453: E/WindowManager(11099): at
android.os.Looper.loop(Looper.java:137) 08-26 11:11:00.453:
E/WindowManager(11099): at
android.app.ActivityThread.main(ActivityThread.java:4921) 08-26
11:11:00.453: E/WindowManager(11099): at
java.lang.reflect.Method.invokeNative(Native Method) 08-26
11:11:00.453: E/WindowManager(11099): at
java.lang.reflect.Method.invoke(Method.java:511) 08-26 11:11:00.453:
E/WindowManager(11099): at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
08-26 11:11:00.453: E/WindowManager(11099): at
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) 08-26
11:11:00.453: E/WindowManager(11099): at
dalvik.system.NativeStart.main(Native Method)
ファイルから座標を読み込んでマップに追加するのは良い方法ではないでしょうか? 多分これを行うためのより良い方法がありますか?