handler.postDelayed在IntentService的onHandleIntent方法中不起作用

时间:2016-04-30 00:03:07

标签: android intentservice android-handler android-intentservice postdelayed

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。但是,任何人都可以解释这一点,比如为什么这不适用于工作线程?提前谢谢。

5 个答案:

答案 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
        }
};