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