【发布时间】:2014-06-11 21:40:36
【问题描述】:
在我的项目中,我想在另一个线程中实现一个计时器,用于倒计时在我的应用程序中执行某个方法所花费的时间,并在花费太多时间时做一些事情。执行 MyManager.startCommand() 方法时,应用程序冻结,我不知道为什么,因为我认为我没有在 UI 线程上做任何事情。我的代码有什么问题吗?
我最初问过这个问题并且没有遇到应用程序冻结,所以我认为这不是因为我正在休眠线程:Runnable posted in another runnable not executed。
public class MyManager{
private MyManager sInstance;
private HandlerThread mHandlerThread;
private Handler mHandler;
private Runnable mTimeoutTimer;
public static MyManager getInstance(){
if(sInstance == null){
sInstance = new MyManager();
}
return sInstance;
}
private MyManager(){
mHandlerThread = new HandlerThread("mHandlerThread");
mHandlerThread.start();
mHandler = new Handler(mHandlerThread.getLooper());
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();
MyCommand.this.run();
}
};
}
public void execute() {
myRun.run();
}
abstract public void run();
}
private void startTimeoutTimer(){
mHandler.post();
}
public void startCommand(){
new MyCommand().execute();
}
}
以及我如何使用 MyCommand 对象:
MyCommand command =
new MyCommand() {
@Override
public void run() {
//make api call that happens in another thread
}
};
所以我基本上是在尝试为该 API 调用创建超时计时器。
【问题讨论】:
标签: android multithreading handler ui-thread