0
 public class CustomScheduledExecutor extends ScheduledThreadPoolExecutor {

   static class CustomTask implements RunnableScheduledFuture { ... 

   protected  RunnableScheduledFuture decorateTask(
            Runnable r, RunnableScheduledFuture task) {
   return new CustomTask(r, task);
   }

AndroidアプリでScheduledThreadPoolExecutorを使おうとしていますが、Javaアプリと同じようには機能しません

}
@Override
public void onClick(View view)
   {

    Runnable runner = new Runnable()
    {

        @Override
        public void run()
        {

            rollthedice();

        }
    };


    if(view == continuous)
    {
    if(now == null)
        {now = scheduler.scheduleAtFixedRate(runner, 0, 250,     TimeUnit.MILLISECONDS);

    }
    else
        return;
    }
    if(view == stop)
    {
        if(now != null)
        {
            now.cancel(true);
            now = null;
        }

        else
            return;
    }
    if(view == roll)
        rollthedice();
    if(view == exit)
        System.exit(0);
   }
  }

これは私のコードです。継続ボタンを続行できません。Javaアプリの場合は正常に機能します。

4

1 に答える 1

1

主な問題は、rollthedice()メソッドが非UIスレッドでスケジュールされてから、一連のUI作業を実行しようとすることだと思います。AndroidのUIオブジェクトはスレッドセーフではないため、クロススレッド呼び出しの動作は予期しないものになる可能性があります。

1つの解決策は、何らかの条件が満たされるまで(たとえば、ユーザーが「停止」を押すまで)、UIスレッドに接続されているにcontinuousRunnable自分自身を再投稿するようにすることです。Handler

Runnable continuousRunnable = new Runnable() {
    public void run() {
        if (stopPressed) {
            return;
        }
        rollthedice();

        mHandler.postDelayed(this, 250);
    }
}

初めて実行するには、次を使用できます。

mHandler.post(continuousRunnable);

再投稿を停止するには、次Runnableを使用しますremoveCallbacks()

mHandler.removeCallbacks(continuousRunnable);
于 2012-11-05T19:34:31.587 に答える