gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:54:45 25 4
gpt4 key购买 nike

对于 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com