【发布时间】: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