AsyncTask和Looper.prepare()错误
我有以下代码
class OverlayTask extends AsyncTask<Void, Void, Void> { @Override public void onPreExecute() { if (sites != null) { myMapView.getOverlays().remove(sites); myMapView.invalidate(); sites = null; } } @Override public Void doInBackground(Void... unused) { grabShipsWithLocation(); return (null); } @Override public void onPostExecute(Void unused) { myMapView.getOverlays().add(sites); myMapView.invalidate(); isLoading = false; } }
这似乎在一些testing设备上正常工作,但我看到很多错误出现在开发控制台上。 我似乎无法解决为什么和在哪里把这个Looper.prepare()。 需要吗?
java.lang.ExceptionInInitializerError at com.test.appname.FinderMain$1.gotLocation(FinderMain.java:286) at com.test.appname.MyLocation$GetLastLocation.run(MyLocation.java:89) at java.util.Timer$TimerImpl.run(Timer.java:289) Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() at android.os.Handler.<init>(Handler.java:121) at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421) at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421) at android.os.AsyncTask.<clinit>(AsyncTask.java:152)
按要求MyLocation.java
class GetLastLocation extends TimerTask { @Override public void run() { lm.removeUpdates(locationListenerGps); lm.removeUpdates(locationListenerNetwork); Location net_loc=null, gps_loc=null; if(gps_enabled) gps_loc=lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); if(network_enabled) net_loc=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); //if there are both values use the latest one if(gps_loc!=null && net_loc!=null){ if(gps_loc.getTime()>net_loc.getTime()) locationResult.gotLocation(gps_loc); else locationResult.gotLocation(net_loc); return; } if(gps_loc!=null){ locationResult.gotLocation(gps_loc); //Line 89 return; } if(net_loc!=null){ locationResult.gotLocation(net_loc); return; } locationResult.gotLocation(null); } }
很长的故事:
AsyncTask
内部使用一个Handler
。 一个处理程序基本上允许你从处理程序被分配到的线程上的另一个线程发布Runnables
,在AsyncTask
的情况下它总是从中调用它的线程。 这只适用于有Looper
准备的线程。
有关更多信息,请参阅http://developer.android.com/reference/android/os/Handler.html
短篇故事:
只需将每个调用包装到FinderMain$1.gotLocation
或在其中创build一个AsyncTask
,然后将其发布到绑定到UI线程的Handler
,如下所示:
class GetLastLocation extends TimerTask { private Handler mHandler = new Handler(Looper.getMainLooper()); @Override public void run() { // ... mHandler.post(new Runnable() { public void run() { locationResult.gotLocation(null); } }); // ... } }
我试过这个…它的工作,希望它会帮助你..
protected class Asyctast extends AsyncTask<String, Integer, Integer> { @Override protected Integer doInBackground(String... params) { // TODO Auto-generated method stub Log.d("Asynctask", ""+params); Looper.prepare(); ImageThumbnailsActivity m = new ImageThumbnailsActivity(); Toast.makeText(ImageThumbnailsActivity.this,""+params ,Toast.LENGTH_SHORT).show(); final Dialog dialog_options = new Dialog(ImageThumbnailsActivity.this); dialog_options.setContentView(R.layout.option); dialog_options.show(); Looper.loop(); return null; } }