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 对象不是线程安全的,因此跨线程调用的行为可能是意料之外的。

一种解决方案是制作一个continuousRunnable将自己重新发布到Handler附加到 UI 线程的 a,直到满足某些条件(例如,用户按下“停止”):

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 回答