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