gpt4 book ai didi

android - Runnable 发布在另一个未执行的 runnable 中

转载 作者:行者123 更新时间:2023-11-29 17:49:25 27 4
gpt4 key购买 nike

我正在尝试使用我的单例的 Handler.post() 方法从另一个 runnable 运行一个 runnable,但是直到原始 runnable 完成后才运行第二个 runnable。在下面的示例代码中,我从应用程序的某处调用 MyManager,getInstance().startCommand()。 MyCommand 类中的 myRun 变量在线程上放置了一个 sleep ,因此我可以测试超时功能,但是直到 myRun 可运行对象完成后才会执行名为 mTimeoutTimer 的可运行对象。为什么会发生这种情况,我该如何改变?

public class MyManager{
private MyManager sInstance;
private Handler mHandler;
private Runnable mTimeoutTimer;

public static MyManager getInstance(){
if(sInstance == null){
sInstance = new MyManager();
}
return sInstance;
}

private MyManager(){
mHandler = new Handler();
mTimeoutTimer = new Runnable() {
@Override
public void run() {
Log.e(“RUNNABLE RUNNING!”);
}
};

public class MyCommand {
private Runnable myRun;

public MyCommand(){
myRun = new Runnable() {
@Override
public void run() {
MyManager.getInstance().startTimeoutTimer();

try {
Thread.sleep(COMMAND_TIMEOUT_MILLIS * 3);
} catch (InterruptedException e) {}

MyCommand.this.execute();
}
};
}

public void execute() {
myRun.run();
}
}


private void startTimeoutTimer(){
mHandler.postDelayed(mTimeoutTimer);
}


public void startCommand(){
new MyCommand().execute();
}
}

最佳答案

那是因为Handler在主线程中被调用所以它会等待另一个完成

而是将您的其他处理程序放在 HandlerThread 中以在单独的线程上运行您的处理程序

    HandlerThread thread = new HandlerThread("HandlerThread");
thread.start();
Handler handler = new Handler(thread.getLooper());

HandlerThread 的文档

  Handy class for starting a new thread that has a looper.
The looper can then be used to create handler classes.
Note that start() must still be called.

关于android - Runnable 发布在另一个未执行的 runnable 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24172356/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com