Android如何在应用程序生活中控制更新线程sleep-awake-alive

时间:2016-10-17 09:20:40

标签: android multithreading

我有一个项目需要通过一个线程循环来更新车辆lat-lnt在Map视图中拉动Api。我希望updateThread可以在应用程序出现onStop或onPause时休眠,当OnResume和Aslo从不醒来时在应用程序生命周期中被杀死;第一次,我尝试使用下面的(解决方案1)来更新:

new Thread(new Runnable() {
    @Override
    public void run() {
        while(true){
         //update-Vehicle-Looping
        }
    }
}).start();

然而,在测试过程中,我发现当应用程序进入onStop或onPause时线程不会被自动杀死,但是,无法保证它不会被杀死,Android将保持运行直到它需要资源线程正在使用。这不会产生很大的资源成本,但也有线程死亡的风险;

所以我尝试使用替代方案(Solution2)whick可以控制提升循环中的线程;

HandlerThread thread = new HandlerThread("MyHandlerThread");
thread.start();
mHandler = new Handler(thread.getLooper());
mHandler.post(UpdateRunable);
Runable UpdateRunable=new Runnable() {
    @Override
    public void run() {
        while(IsRun){
         //update-Vehicle-Looping
        }
    }
};

使用IsRun控制更新线程唤醒或在app提升周期中休眠;从某种意义上(解决方案2)改进(解决方案1)。但是不能避免线程被杀的风险。

任何机构都可以给我一些建议来控制应用程序生命周期中的更新线程吗?

2 个答案:

答案 0 :(得分:0)

您应该在服务中移动逻辑,这样它就不会首先依赖于Activity的生命周期。这样做,您可以停止将事件分派到地图视图。使用服务绑定从服务

控制UI

答案 1 :(得分:0)

在更新ui时,应该使用带有Runable接口的处理程序。 当您处于活动生命周期的持续阶段时,您不应向处理程序发送任何消息,因为您的应用程序将崩溃。