首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >runnable的问题

runnable的问题
EN

Stack Overflow用户
提问于 2010-10-22 18:59:16
回答 2查看 4.5K关注 0票数 1

我被建议使用这段代码让我的方法在一段确定的时间后执行,我对它进行了一些修改,现在我做到了:

代码语言:javascript
复制
private Handler mHandler = new Handler();
private Runnable mUpdateTimeTask = new Runnable() {
    public void run() {
        final long start = mStartTime;

        // Get the difference in ms
        long millis = SystemClock.uptimeMillis() - start;

        // Format to hours/minutes/seconds
        int mTimeInSec = (int) (millis / 1000);

        // Do your thing

        Location location = tracker.getLastKnownLocation(best);
        RetrieveAvgPower(location);

        // Update at the next second
        mHandler.postAtTime(this, 1000);//start + ((mTimeInSec + 10) * 1000));
    }
};

我试着开始和停止它:

代码语言:javascript
复制
public void onClick(View v) {
         switch (v.getId()) {
            case R.id.start:
                    mStartTime = System.currentTimeMillis();
                    mHandler.removeCallbacks(mUpdateTimeTask);
                    mHandler.postDelayed(mUpdateTimeTask, 1000);
                    break;
                case R.id.stop:
                    mHandler.removeCallbacks(mUpdateTimeTask);
                    break;}}

然而,有一个问题。首先,我的方法设置文本并将一行写入日志文件,但如果我使用上面的代码,则不会设置文本,但是所有信息都会自动写入日志文件。另一件事是我不能停止runnable -在它开始执行后,程序似乎没有响应,如果我试图按下停止按钮,就会崩溃。我做错了什么?如何解决?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-22 19:46:19

run()的最后一行不应该调用Handler.postDelayed()而不是Handler.postAtTime()

根据Android中事件队列的实现方式,您可能会使用错误的线程来终止线程……您基本上是在重复设置Runnable,使其在线程最初启动后1秒运行,这样就不会有其他事件运行。

票数 2
EN

Stack Overflow用户

发布于 2010-10-22 19:54:08

要停止你的runnable,你可以添加类似这样的东西:

代码语言:javascript
复制
class A implements Runnable
{
private volatile boolean runTask = false;

public void run()
{
   runTask = true;
   while(runTask)
   {
      // Do your thing
      Thread.sleep(1000); // wait 1 second before "Do your thing" again
   }
}


public void stop()
{
   runTask = false;
}


}

至于文本没有更新,我不太理解,是不是在swing gui中没有设置?

EDIT在run方法的末尾添加了一个Thread.sleep(1000

由同级编辑:移动Thread.Sleep(1000),使Runnable每秒运行一次,直到停止(而不是连续运行,然后在停止后等待1秒)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3996133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档