【问题标题】:Android AsyncTask -Android AsyncTask -
【发布时间】:2014-04-02 10:00:55
【问题描述】:

我有一个线程循环并显示一个进度对话框,直到一切都完成。

在这个线程中,我试图运行一个类“MapInteractor”,它将多边形绘制到谷歌地图上。但是我收到一个错误,“不在主线程上”。所以我读了一些关于它的内容,人们似乎建议使用 AsyncTask。 我试过这个,但我仍然得到一个错误。缩短的代码如下所示,以及错误。 如果有人对如何解决此问题有任何想法,将不胜感激。 我已经把头发扯了好几个小时了!!

    mapInteractor = new MapInteractor(this);
    fileReader = new FileReader(this);

    try {
        progress = ProgressDialog.show(this, progressText, "Loading..",
            true);


        new Thread(new Runnable() { 
            public void run() { 

                //does stuff

          for (CountryData c : countryData){ 
              try {
                c.setLatAndLong(fileReader.getlatlong(c.getCountryName()));
                } catch (IOException e) {
                    e.printStackTrace();
                }
              mapInteractor.execute(c.getLatAndLong());
          }

          runOnUiThread(new Runnable() {              
          @Override 
          public void run() { 
              progress.dismiss(); 
              } 
          }); 
          }
        }).start(); 


    } catch (Exception e) {
        e.printStackTrace();
    }

    }

我的地图交互器类:

    public class MapInteractor extends AsyncTask<double[],Integer,Boolean>{

 // Google Map
    private static GoogleMap googleMap;
    private int j = 1;
    static int count = 0;
    private FragmentActivity fragmentActivity  = null;

    public MapInteractor(FragmentActivity  fragmentActivity) {
      this.fragmentActivity = fragmentActivity;
     }


@Override
protected Boolean doInBackground(double[]... latLongs) {
    boolean complete = false;
    count++;
    System.out.println(count);
    if (googleMap == null) {
        googleMap = ((SupportMapFragment) fragmentActivity.getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
    }

    PolygonOptions polygonOptions = new PolygonOptions(); 
    System.out.println("length of array = " + latLongs[0].length);
    for(int i =0;i < latLongs[0].length-1;i++){         
        if(i == 0){
            polygonOptions.add(new LatLng(latLongs[0][j], latLongs[0][i])); 
        }else{
            try{
                if(((i*2 )+1) <= latLongs.length){
                    polygonOptions.add(new LatLng(latLongs[0][(i*2 )+1], latLongs[0][i*2]));
                }

            }catch(Exception e){
                e.printStackTrace();
            };              
        }     
    }
    if(latLongs.length != 0){
        Polygon polygon = googleMap.addPolygon(polygonOptions.strokeColor(Color.TRANSPARENT).fillColor(Color.RED));
        complete = true;
    }
    return complete;
}

我得到以下堆栈跟踪:

   04-02 10:48:46.320: E/AndroidRuntime(1704): FATAL EXCEPTION: AsyncTask #1
   04-02 10:48:46.320: E/AndroidRuntime(1704): java.lang.RuntimeException: An error occured while executing doInBackground()
   04-02 10:48:46.320: E/AndroidRuntime(1704):  at android.os.AsyncTask$3.done(AsyncTask.java:200)
   04-02 10:48:46.320: E/AndroidRuntime(1704):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
   04-02 10:48:46.320: E/AndroidRuntime(1704):  at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
   04-02 10:48:46.320: E/AndroidRuntime(1704):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
   04-02 10:48:46.320: E/AndroidRuntime(1704):  at java.util.concurrent.FutureTask.run(FutureTask.java:138)
   04-02 10:48:46.320: E/AndroidRuntime(1704):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
   04-02 10:48:46.320: E/AndroidRuntime(1704):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
   04-02 10:48:46.320: E/AndroidRuntime(1704):  at java.lang.Thread.run(Thread.java:1019)
   04-02 10:48:46.320: E/AndroidRuntime(1704): Caused by: java.lang.IllegalStateException: Not on the main thread
   04-02 10:48:46.320: E/AndroidRuntime(1704):  at maps.k.o.b(Unknown Source)
   04-02 10:48:46.320: E/AndroidRuntime(1704):  at maps.i.g.b(Unknown Source)
   04-02 10:48:46.320: E/AndroidRuntime(1704):  at maps.e.al.a(Unknown Source)
   04-02 10:48:46.320: E/AndroidRuntime(1704):  at etl.onTransact(SourceFile:152)
   04-02 10:48:46.320: E/AndroidRuntime(1704):  at android.os.Binder.transact(Binder.java:279)
   04-02 10:48:46.320: E/AndroidRuntime(1704):  at com.google.android.gms.maps.internal.IGoogleMapDelegate$a$a.addPolygon(Unknown Source)
   04-02 10:48:46.320: E/AndroidRuntime(1704):  at com.google.android.gms.maps.GoogleMap.addPolygon(Unknown Source)
   04-02 10:48:46.320: E/AndroidRuntime(1704):  at test.threatlevelsystemproject.MapInteractor.doInBackground(MapInteractor.java:60)
   04-02 10:48:46.320: E/AndroidRuntime(1704):  at test.threatlevelsystemproject.MapInteractor.doInBackground(MapInteractor.java:1)
   04-02 10:48:46.320: E/AndroidRuntime(1704):  at android.os.AsyncTask$2.call(AsyncTask.java:185)
   04-02 10:48:46.320: E/AndroidRuntime(1704):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
   04-02 10:48:46.320: E/AndroidRuntime(1704):  ... 4 more

谢谢。

【问题讨论】:

  • 发布您的完整日志

标签: java android multithreading android-asynctask


【解决方案1】:

AsyncTask 类中的doInBackground 方法,在其他线程中执行,您不能在此方法中进行任何 UI 更改,您可以在 onPostExecute 方法中进行 UI 更改。

PolygonOptions polygonOptions;

@Override
protected void onPreExecute() {
   if (googleMap == null) {
       googleMap = ((SupportMapFragment) fragmentActivity.getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
   }
}

....

 @Override
protected void onPostExecute() {
    Polygon polygon = googleMap.addPolygon(polygonOptions.strokeColor(Color.TRANSPARENT).fillColor(Color.RED));
}

或者,如果您愿意,您可以在您的 Activity 中创建一个处理程序并在 doInBackground 中发布可运行文件,为此您必须将 AsyncTask 声明为您的 Activity 或片段的内部类

【讨论】:

    猜你喜欢
    • 2013-05-09
    • 2014-07-21
    • 2012-11-16
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多