0

サービスでデータの準備ができた後でのみアクティビティを開始しようとしています。データの準備状況についてサービスを常にポーリングするタイマータスクを使用してこれを試しています。

public class SplashTask extends TimerTask {
    @Override
    public void run() {
        Log.i(MY_DEBUG_TAG, "Internet is accessible, Running some Spalsh screen Tasks ");
        if(mBoundService.isDataReady()) {
            Log.e(MY_DEBUG_TAG, "Data is ready in service..");
            startActivityForResult(new Intent(SplashDroid.this, FunWithDataActivity.class), 3);
        } else {
            Log.e(MY_DEBUG_TAG, "Data not ready in service..");
        }
        Log.i(MY_DEBUG_TAG, "Spalsh Tasks fnished..");
    }
}

問題は、データの準備ができてFunWithDataActivityが開始されようとしているときに、次のエラーが発生することです。

07-27 14:53:40.614: ERROR/AndroidRuntime(1042): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
4

4 に答える 4

3

startActivityForResultUIスレッド(ハンドラーが実行されるスレッドではありません)から呼び出す必要があります。これを実現するには、startActivityForResultコードをに移動し、内Runnableでを使用して実行します。runOnUiThreadrun()

于 2011-07-27T09:41:32.760 に答える
1

startActivityForResultUI以外のスレッドからは使用できません。runOnUiThread()またはを使用できますHandler.post()

また、ポーリングに別のスレッドを実際に使用するべきではありません。ポーリングにはHandlerの関数を使用します。postDelayed()このようにして、単純なポーリングのためにスレッド全体を無駄にすることはありません。例については、以下を参照してください。時間遅延のあるタスクを繰り返しますか?

于 2011-07-27T09:42:34.440 に答える
0

代わりに、 CountDownTimerクラスを使用してみてください。例としてこの回答も見ることができます:AndroidのTimerTask?

于 2011-07-27T09:41:26.207 に答える
0

これらの投稿を調べる価値があります:

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

ProgressDialogのAsyncTask内でLooper.prepare()を呼び出さなかったスレッド内にハンドラーを作成できません

解決されない場合は、問題に直面している場所にコードを投稿できますか?

于 2011-07-27T09:42:54.357 に答える