java - 如何使用 onRestart() 取消暂停/重启 Android Activity 中的线程?

标签 java android multithreading android-activity runnable

对于 Android Activity ,如何在 onStop() 上停止或暂停线程,然后在 onRestart() 上重新启动或取消暂停线程?当我在手机上开始另一个 Activity 时,看起来 onStop() 正确地停止了我的线程,但是当我尝试重新启动我的 Activity 时,onRestart() 不起作用预期并且线程不再运行,即我的 View 不再刷新并且倒计时被卡住。 (旋转我的手机似乎重新启动了线程,即 View 恢复刷新并且倒计时处于 Activity 状态。)

此外,onStop() 是停止你的线程更好,还是应该只暂停它?

public class MyActivity extends Activity {

    private static final int SLEEP_TIME = 500;  
    private RefreshingThread refreshingThread = new RefreshingThread();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        refreshingThread.start();
    }

    @Override
    protected void onStop(){
        super.onStop();
        refreshingThread.pause();
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        refreshingThread.unpause();
    }

    private void updateViews() {
    // code to update my Views, including refreshing a countdown        
    }

    class RefreshingThread extends Thread {

        private volatile boolean isPaused = false;

        @Override
        public void run() {
            try {
                while (!isInterrupted() && !isPaused) {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                             updateViews();
                        }
                    });
                    Thread.sleep(SLEEP_TIME);
                }
            } catch (InterruptedException e) {
                Log.w("MyActivity", "Caught InterruptedException", e);
            }
        }

        public void pause() {
            isPaused = true;
        }

        public void unpause() {
            isPaused = false;
        }

    }
}

最佳答案

首先,建议通过从服务器推送新数据而不是拉取新数据来刷新数据 - 这将有助于节省电池、带宽并总体上提高效率。您可以使用 GCM 推送数据,例如检查:http://www.doubleencore.com/2013/09/push-dont-poll-how-to-use-gcm-to-update-app-data/

如果您仍然喜欢每 X 秒提取一次数据 (SLEEP_TIME),我建议您使用定时器,它可以安排为每 X 秒运行一次 TimerTask。然后你可以从 onPause/onResume 取消/重启它。示例:

public class RefreshManager {
    private static Timer timer = null;
    private RefreshTimerTask refreshTask;

    public void onResume() {
        this.start(INIT_DELAY_TIME);
    }

    public void onPause() {
        this.stop();
    }

    private void start(long delay) {
        stop(); // stop any older timer instance if exist.
        timer = new Timer();
        refreshTask = new RefreshTimerTask();
        timer.schedule(refreshTask, delay, SLEEP_TIME);
    }

    private void stop() {
        if (timer != null) {
            timer.cancel();
            refreshTask = null;
            timer = null;
        }
    }

    private class RefreshTimerTask extends TimerTask {
        @Override
        public void run() {
            updateViews();
        }
    }
}

您应该创建一个 RefreshManager 实例并在 onPause/onResume Activity 上调用它的 onResume 和 onPause。

关于java - 如何使用 onRestart() 取消暂停/重启 Android Activity 中的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20866021/

相关文章:

java - 如何在couchbase中存储序列化的java对象(字节数组)?

java - 如何使用数据库为所有现有表创建实体类?

java - 如何在 Selendroid 中执行滑动操作?

android - 将 groupBy 和 toList rxjava 函数与 sqlbrite 一起使用

带有外部模拟 ContentProvider 的 androidTest

javascript - 来自 JavaScript 的 JavaFX WebView 向上调用不起作用

java - 多个父类(super class)和代码重用

javascript - 说 Node.js 和 JavaScript 提供基于事件循环的并发模型是不正确的吗?

java - 线程一个接一个地运行,但不同时运行,我该如何解决这个问题?

java - 当两个条件对象分配给锁定对象时发生死锁