ZeroMQ
"延迟"会在日志中显示,但根本不显示。并且final Handler handler = new Handler();
LOG.d("delay");
handler.postDelayed(new Runnable() {
@Override public void run() {
LOG.d("notify!");
//calling some methods here
}
}, 2000);
中调用的方法也根本不被调用。任何人都可以帮助解释为什么会发生这种情况,我做错了吗?
具有此代码的类扩展了IntentService,这会有问题吗?
============================
更新:
我将此代码放在扩展run()
的类中。我发现它唯一有用的地方是构造函数。但我需要把它放在IntentService
方法中。所以我检查了onHandleIntent
的文档,并说:
在工作线程上调用此方法并请求处理。一次只处理一个Intent,但处理发生在独立于其他应用程序逻辑运行的工作线程上。因此,如果此代码需要很长时间,它将阻止对同一个IntentService的其他请求,但它不会阻止其他任何内容。处理完所有请求后,IntentService会自行停止,因此您不应该调用stopSelf。
因此,基于我得到的结果,我觉得我不能在"工作线程"中使用onHandleIntent
。但是,任何人都可以解释这一点,比如为什么这不适用于工作线程?提前谢谢。
答案 0 :(得分:6)
您正在使用主线程的looper。您必须创建一个新的循环器,然后将其交给您的处理程序。
HandlerThread handlerThread = new HandlerThread("background-thread");
handlerThread.start();
final Handler handler = new Handler(handlerThread.getLooper());
handler.postDelayed(new Runnable() {
@Override public void run() {
LOG.d("notify!");
// call some methods here
// make sure to finish the thread to avoid leaking memory
handlerThread.quitSafely();
}
}, 2000);
或者您可以使用Thread.sleep(long millis)。
try {
Thread.sleep(2000);
// call some methods here
} catch (InterruptedException e) {
e.printStackTrace();
}
如果要停止休眠线程,请使用yourThread.interrupt();
答案 1 :(得分:3)
转换
final Handler handler = new Handler();
到
final Handler handler = new Handler(Looper.getMainLooper());
这对我有用。
答案 2 :(得分:0)
当设备屏幕打开时,处理程序和服务将是可预测的。 如果设备进入休眠状态,例如处理程序将不是一个可行的解决方案。
使用更好,更可靠的解决方案:
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
答案 3 :(得分:0)
IntentService
并非针对此类情况而设计。您可以使用常规Service
代替。您可以将处理程序放在onStartCommand()
中。别忘了
在服务实例上调用stopSelf()
以在handler.postDelayed(){}
答案 4 :(得分:-1)
这就是我使用处理程序的方式:
import android.os.Handler;
Handler handler;
//initialize handler
handler = new Handler();
//to start handler
handler.post(runnableName);
private Runnable runnableName= new Runnable() {
@Override
public void run() {
//call function, do something
handler.postDelayed(runnableName, delay);//this is the line that makes a runnable repeat itself
}
};