在扩展说明中:对于android java.util.concurrent.ScheduledThreadPoolExecutor这是什么?

时间:2012-11-05 19:09:43

标签: android

 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应用程序它将正常工作

1 个答案:

答案 0 :(得分:1)

我认为主要问题是你的rollthedice()方法是在非UI线程上安排的,然后尝试做一堆UI工作。 Android的UI对象不是线程安全的,因此跨线程调用的行为可能是意外的。

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

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

        mHandler.postDelayed(this, 250);
    }
}

要让它第一次运行,您可以使用以下内容:

mHandler.post(continuousRunnable);

要停止重新发布Runnable,请使用removeCallbacks()

mHandler.removeCallbacks(continuousRunnable);