0

私のAndroidアプリケーションではタイマースケジュールを使用していますが、以下のようにタイマー0の致命的な例外が発生します。どうすれば削除できますか。以下のコードについても言及しています-

01-28 13:44:41.142: E/AndroidRuntime(1307): FATAL EXCEPTION: Timer-0
01-28 13:44:41.142: E/AndroidRuntime(1307):android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
01-28 13:44:41.142: E/AndroidRuntime(1307):     at android.view.ViewRoot.checkThread(ViewRoot.java:2932)
01-28 13:44:41.142: E/AndroidRuntime(1307):     at android.view.ViewRoot.invalidateChild(ViewRoot.java:642)
01-28 13:44:41.142: E/AndroidRuntime(1307):     at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:668)
01-28 13:44:41.142: E/AndroidRuntime(1307):     at android.view.ViewGroup.invalidateChild(ViewGroup.java:2511)
01-28 13:44:41.142: E/AndroidRuntime(1307):     at android.view.View.invalidate(View.java:5279)
01-28 13:44:41.142: E/AndroidRuntime(1307):     at android.view.View.setBackgroundDrawable(View.java:7626)
01-28 13:44:41.142: E/AndroidRuntime(1307):     at android.view.View.setBackgroundResource(View.java:7535)
01-28 13:44:41.142: E/AndroidRuntime(1307):     at com.example.iqtest.PlayGame$1.run(PlayGame.java:61)
01-28 13:44:41.142: E/AndroidRuntime(1307):     at java.util.Timer$TimerImpl.run(Timer.java:284)

そしてコードは-

protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.next);
    but1=(Button) findViewById(R.id.b1);
    but2=(Button) findViewById(R.id.b2);
    but3=(Button) findViewById(R.id.b3);

    myTimer = new Timer();

    myTimer.schedule(new TimerTask() {      

        @Override
        public void run() {
            Random rand=new Random();
            int num=rand.nextInt(9)+1;

            num = rand.nextInt(buttonIds.length);
            int buttonId = buttonIds[num];
            Button bb=(Button) findViewById(buttonId);

            Drawable a=bb.getBackground();
            if(getResources().getDrawable(R.drawable.happy).equals(a))
             bb.setBackgroundResource(R.drawable.happy);
            else
                bb.setBackgroundResource(R.drawable.whoa);
        }
    },0, 1000);
}
4

4 に答える 4

5

runOnUiThreadを使用して、TimertaskrunメソッドからUI要素を次のように更新します。

 myTimer.schedule(new TimerTask() {      

 @Override
 public void run() {
  Current_Activity.this.runOnUiThread(new Runnable() {
    public void run() {
        // update UI here
    }
 });
 }
},0, 1000);
于 2013-01-28T08:31:45.863 に答える
2

CountDownTimerの代わりに使用できますTimer

Timer timer = new CountDownTimer(Long.MAX_VALUE, 1000) {
    public void onTick(long millisUntilFinished) {
        // the code in the method run
    }

    public void onFinish() {

    }
};

メソッドonTickonFinishはUIスレッドで呼び出されます。

タイマーがアクションの実行を開始するには、次のコマンドを実行します。timer.start()

于 2013-01-28T08:32:15.733 に答える
0

それは非常に簡単です、あなたはタイマーをスケジュールしていますが、決してそれをキャンセルしません。したがって、スケジュールされたタスクはキューに入れられ、その順番を待ちます。その時までにそれは実行されるはずですあなたのアクティビティはフォアグラウンドになく、ビューを見つけることができないかもしれません。したがって、致命的な例外をスローしています。上記の問題を解決するには、を呼び出して特定のアクティビティから移動するたびに、タスクをキャンセルする必要がありますmyTimer.cancel()

またはそうでなければ

Handlerクラスを使用します。

于 2013-01-28T08:32:23.950 に答える