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