0

タイマースレッド内でAsynTaskをトリガーしたいのですが、次のエラーが発生します。

java.lang.ExceptionInInitializerError原因:java.lang.RuntimeException:Looper.prepare()を呼び出していないスレッド内にハンドラーを作成できません

それは可能かどうか??? これが私のコードです

networkTimer = new Timer();
                networkTimer.schedule(new TimerTask() {
                    int counter = 1;
                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        if(isNetworkAvailable()){
                            Log.d("Hey I got the Network","!!");
                            new GmailAsync().execute("");
                            networkTimer.cancel();
                        }else{
                            Log.d("Attempt","No:"+counter);
                            counter++;
                            if(counter == 6){
                                Log.d("Attempt","Finished");
                                networkTimer.cancel();
                            }
                        }
                    }
                },0, 5000);
4

2 に答える 2

1

AsyncTask.execute()UIスレッドで実行する必要がありますが、TimerTaskでは実行できません。

提案:* runOnUiThreadを使用してUIスレッドに戻り、AsyncTaskを使用します*タイマーではなく、ハンドラーとpostDelyaedを使用します* UIを操作する必要がない場合は、AsyncTaskを使用しないでください(かもしれませんが、AsyncTaskが何をするのかわかりません。

最善の解決策は#2です。それは次のようになります:

mHandler.postDelayed(new Runnable() {
    @Override
    public void run() {
        if(isNetworkAvailable()){
            Log.d("Hey I got the Network","!!");
            new GmailAsync().execute("");
        }else{
            Log.d("Attempt","No:"+counter);
            counter++;
            if(counter == 6){
                Log.d("Attempt","Finished");
            } else {
                mHandler.postDelayed(this, 5000);
            }
        }
    }, 5000);
}

カウンターが6未満である限り、実行可能な再投稿自体

于 2012-11-23T10:40:55.390 に答える
0

FinderMain $ 1.gotLocationへのすべての呼び出しまたはその中のAsyncTaskの作成をRunnableでラップし、次のようにUIスレッドにバインドされたハンドラーに投稿するだけです。

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);
              }
           });
           // ...
         }
    }
于 2012-11-23T10:42:47.530 に答える