Java Android异步任务-

Java Android异步任务-,java,android,multithreading,android-asynctask,Java,Android,Multithreading,Android Asynctask,我有一个线程循环并显示进度对话,直到一切都完成 在这个线程中,我试图运行一个类“MapInteractor”,它在google地图上绘制多边形。然而,我得到了一个错误,“不在主线程上”。所以我读了一些关于它的文章,人们似乎建议使用异步任务。 我试过了,但还是出错了。下面显示了缩短的代码以及错误。 如果有人知道如何解决这个问题,我们将不胜感激。 我已经把头发扯了好几个小时了 mapInteractor = new MapInteractor(this); fileReader =

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

在这个线程中,我试图运行一个类“MapInteractor”,它在google地图上绘制多边形。然而,我得到了一个错误,“不在主线程上”。所以我读了一些关于它的文章,人们似乎建议使用异步任务。 我试过了,但还是出错了。下面显示了缩短的代码以及错误。 如果有人知道如何解决这个问题,我们将不胜感激。 我已经把头发扯了好几个小时了

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

谢谢。

doInBackground
方法在
AsyncTask
类中,在其他线程中执行,您不能在此方法中进行任何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));
}

或者,如果需要,您可以在活动中创建一个处理程序,并在
doInBackground
中发布可运行,对于这个处理程序,您必须将
AsyncTask
声明为活动或片段的内部类

发布完整的日志
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));
}