web-dev-qa-db-ja.com

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

いくつかのテストデバイスでは正常に機能するようですが、開発コンソールに多くのエラーが表示されています。この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);
    }
}
31
Lee Armstrong

長編:

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);
          }
       });
       // ...
     }
}
95
Timo Ohr

私はこれを試しました...それはうまくいきました、それがあなたを助けることを願っています..

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;
    }       
}
18
Nilesh Tupe