2014-02-20 22 views
1

我有一个BroadcastReceiver,我需要在那里长时间操作。这是我的代码:线程关闭一次BroadcastReceiver.onCreate()结束了吗?

public class clsMyReceiver extends BroadcastReceiver 
{ PowerManager oPowerManager; 
    PowerManager.WakeLock oWakeLock; 

    @Override public void onReceive(Context context, Intent intent) 
    { //Aviod the device to go to Sleep: 
     oPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
     oWakeLock = oPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelock"); 
     oWakeLock.acquire(); 

     new Thread() 
     { public void run() 
     { //...... 
      //Perform long operation here 
      //...... 

      if(oWakeLock.isHeld()) 
       oWakeLock.release(); 
     } 
     }.start(); 

    } 
} 

据我所知,这是不允许的,因为一旦onReceive完成创建的所有任务被杀死。这是正确的吗?即使我使用WakeLock? 这是最好的解决方案是什么? “长时间操作”可持续约2分钟。我想避免为此提供其他服务。 感谢

回答

0

您可以创建的AsyncTask并通过oWakeLock到的AsyncTask的构造。

public class MyTask extends AsyncTask<Object, Object, Object>{ 
    PowerManager.WakeLock oWakeLock; 
    public MyTask(PowerManager.WakeLock oWakeLock){ 
    this.oWakeLock = oWakeLock; 
    } 
// other methods of asyncktask below 

} 

或者使用线程也可以做到这一点,但AsyncTask使用更简单。

class MyThread implements Runnable{ 


PowerManager.WakeLock oWakeLock; 
     public MyThread(PowerManager.WakeLock oWakeLock){ 
     this.oWakeLock = oWakeLock; 
     } 



public void run(){ 
      // perform long running task 
     } 

} 
0

据我知道这是不尽快允许的,因为作为的onReceive完成创建被杀害的所有任务。这是正确的吗?

不适用于Thread s的情况。如果您的onReceive()方法被触发,您将执行所有操作,但由于您有Thread,它的执行会在后台执行,所以即使您的onReceive()方法完成,您的Thread也会一直运行,直到您停止执行或在执行后自行完成。

即使我使用WakeLock?什么是最好的解决方案? “长时间手术”可持续约2分钟。我想避免为此提供其他服务。谢谢

您可以按照自己的方式进行操作,也可以声明AsyncTask。您需要确定哪种解决方案更适合您的实施,但两者都有效。

+0

这是我读的:**任何需要异步操作的东西都不可用,因为您需要从处理异步操作的函数返回,但此时BroadcastReceiver不再处于活动状态,因此系统在异步操作完成之前可以自由地终止它的进程。**(请参阅http://developer.android.com/reference/android/content/BroadcastReceiver.html) – Ton

+0

我不太确定这种情况的重演。我明白,除了不允许这么做外,它可以在线程执行过程中的任何时候释放'BroadcastReceiver',它会不安全地结束它。你有没有测试过它看到它需要的行为? – nKn

+0

一种方法是使用'CountDownLatch(1)'同步,它像信号量一样工作。在你的'onReceive()'方法的''''''结尾之前,你会调用'CountDownLatch.await()'方法,一旦它完成,你的'Thread'就会调用'.countDown()'方法。这样你就可以确保你的'onReceive()'方法在'Thread'执行结束之前不会被释放。 – nKn