向GoogleMap添加项目时出现Android AsyncTask错误

向GoogleMap添加项目时出现Android AsyncTask错误,android,map,android-asynctask,Android,Map,Android Asynctask,我想从文件中加载坐标,并在异步任务中将形状添加到地图中。但我得到了错误,我不知道为什么。这是我的密码: private class shpLoading extends AsyncTask<GoogleMap, Void, String> { ProgressDialog dialog; @Override protected String doInBackground(GoogleMap... params) {

我想从文件中加载坐标,并在异步任务中将形状添加到地图中。但我得到了错误,我不知道为什么。这是我的密码:

   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();
          }                      
   }   
mMap是GoogleMap变量。如果我将所有
doInBackground
code添加到
onPostExecute
方法中,并将变量
map
更改为全局
mMap
一切正常,但我希望在后台执行此任务,同时显示加载对话框

这是我的日志:

 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)
08-26 11:10:52.368:E/AndroidRuntime(11099):致命异常:
异步任务#1
08-26 11:10:52.368:E/AndroidRuntime(11099):
java.lang.RuntimeException:执行时出错
doInBackground()
08-26 11:10:52.368:E/AndroidRuntime(11099):在
android.os.AsyncTask$3.done(AsyncTask.java:299)08-26 11:10:52.368:
E/AndroidRuntime(11099):在
java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
08-26 11:10:52.368:E/AndroidRuntime(11099):在
java.util.concurrent.FutureTask.setException(FutureTask.java:124)
08-26 11:10:52.368:E/AndroidRuntime(11099):在
java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
08-26 11:10:52.368:E/AndroidRuntime(11099):在
java.util.concurrent.FutureTask.run(FutureTask.java:137)08-26
11:10:52.368:E/AndroidRuntime(11099):在
android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)08-26
11:10:52.368:E/AndroidRuntime(11099):在
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
08-26 11:10:52.368:E/AndroidRuntime(11099):在
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
08-26 11:10:52.368:E/AndroidRuntime(11099):在
java.lang.Thread.run(Thread.java:856)08-26 11:10:52.368:
E/AndroidRuntime(11099):由以下原因引起:java.lang.IllegalStateException:
不在主螺纹08-26 11:10:52.368:E/AndroidRuntime(11099)上:
在地图上。ar.p.b(未知来源)08-26 11:10:52.368:
E/AndroidRuntime(11099):位于地图al.g.b(未知来源)08-26
11:10:52.368:E/AndroidRuntime(11099):位于maps.ag.an.a(未知)
来源)08-26 11:10:52.368:E/AndroidRuntime(11099):at
bkw.onTransact(源文件:137)08-26 11:10:52.368:
E/AndroidRuntime(11099):在
android.os.Binder.transact(Binder.java:326)08-26 11:10:52.368:
E/AndroidRuntime(11099):在
com.google.android.gms.maps.internal.igoglemappdelegate$a$a.addPolyline(未知
来源)08-26 11:10:52.368:E/AndroidRuntime(11099):at
com.google.android.gms.maps.GoogleMap.addPolyline(未知源)
08-26 11:10:52.368:E/AndroidRuntime(11099):在
com.es.map.Measuring$shpLoading.doInBackground(Measuring.java:1165)
08-26 11:10:52.368:E/AndroidRuntime(11099):在
com.es.map.Measuring$shpLoading.doInBackground(Measuring.java:1)08-26
11:10:52.368:E/AndroidRuntime(11099):在
android.os.AsyncTask$2.call(AsyncTask.java:287)08-26 11:10:52.368:
E/AndroidRuntime(11099):在
java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
8-26 11:10:52.368:E/AndroidRuntime(11099):。。。5更多08-26
11:11:00.453:E/WindowManager(11099):活动com.es.map.com
窗户漏水了
com.android.internal.policy.impl.PhoneWindow$DecorView@42229e30那个
最初添加于此处08-26 11:11:00.453:E/WindowManager(11099):
android.view.WindowLeaked:Activity com.es.map.Measured已泄漏
window com.android.internal.policy.impl.PhoneWindow$DecorView@42229e30
最初添加到这里08-26 11:11:00.453:
E/WindowManager(11099):在

android.view.ViewRootImpl.您不能在后台执行ui操作,map.add应该在进度更改中发生。。。只需调用report progress并在那里绘制地图。

很抱歉,您无法从后台线程更改UI组件,您必须在UIThread中编写地图操作

现有代码中的解决方案如下:

private Handler mHandler = new Handler();

    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();
              }

              mHandler.post(new Runnable() {
                public void run() {
                    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();
        }                      
 }   
private Handler mHandler=new Handler();
私有类加载扩展了异步任务{
进程对话;
@凌驾
受保护的字符串doInBackground(谷歌地图…参数){
shpreder shpRead=新的shpreder();
谷歌地图=参数[0];
试一试{
shpRead.reading();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(InvalidShapeFileException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
mHandler.post(新Runnable(){
公开募捐{
用于(车床a:shpRead.points())
addMarker(新的MarkerOptions()
.职位(a)
.draggable(false));
int i=0;
对于(列表a:shpRead.lines()){
addPolyline(新的PolylineOptions()
.addAll(a)
.宽度(3)
.颜色(颜色.红色));
}
对于(列表a:shpRead.polygons()){
addPolygon(新polygonooptions()
.addAll(a)
.冲程宽度(3)
.strokeColor(颜色.红色)
.fillColor(0x3F00FF00));
}
}
});
返回“完成”;
} 
@凌驾
受保护的void onPreExecute(){
dialog=新进度dialog(测量.this);
setMessage(“Kraunama…”);
对话框。setUndeterminate(true);
对话框。可设置可取消(false);
dialog.show();
}
@凌驾
受保护的void onProgressUpdate(void…值){
}
@凌驾
受保护的void onPostExecute(字符串结果){
private Handler mHandler = new Handler();

    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();
              }

              mHandler.post(new Runnable() {
                public void run() {
                    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();
        }                      
 }