私は次のコードを持っています
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;
}
}
いくつかのテストデバイスでは正常に機能するようですが、開発コンソールに多くのエラーが表示されています。この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
へのすべての呼び出し、またはAsyncTask
内のRunnable
の作成をすべてラップして、次のように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;
}
}