如何阻止Handler在android中工作?

时间:2013-11-28 07:18:48

标签: android handler intentservice

我的APP在接收ACTION_SCREEN_OFF时必须开始一些耗时的工作,如果作业仍在进行,则在接收ACTION_SCREEN_ON时中断作业。

public class TimeConsumingWorkIntentService extends IntentService {
    @Override
    protected void onHandleIntent(Intent intent) {
       TimeConsumingWork();
    }
}

public class ScreenStatusReceiver extends BroadcastReceiver {
  Intent intent = new Intent(mContext, TimeConsumingWorkIntentService.class);
  @Override
  public void onReceive(Context context, Intent intent) {
      if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
          mContext.startService(intent );
      } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
          mContext.stopService(intent );
      }
  }
}

通过打印时间记录,我发现耗时的工作仍在停止TimeConsumingWorkIntentService(接收ACTION_SCREEN_ON时)。

为什么?

2 个答案:

答案 0 :(得分:3)

使用

// Cancel the runnable

myHandler.removeCallbacks(yourRunnable);

好的,那么你可以做这样的事情

Runnable r = new Runnable{
public void run(){
    if(booleanCancelMember != false){
        // within this you make the call to handler and work
        // Since you block the call the handler wont get repeated
    }
  }
}

答案 1 :(得分:0)

你不能那样做。当您启动IntentService时,它将在单独的工作线程上调用onHandleIntent()。那个方法然后调用TimeConsumingWork()。停止服务不会中断工作线程的执行。它只是告诉工作线程,当它完成处理当前Intent时,它应该停止。

您需要做的是定期查看TimeConsumingWork()方法是否应该停止。您可以通过设置static boolean变量并TimeConsumingWork()定期检查此变量并退出(如果已设置)来执行此操作。

您无需在stopService()上致电IntentService,因为它无关紧要时会自行停止。