[英]How can I use onRestart() to unpause/restart a thread in an Android Activity?
对于Android活动,如何在onStop()
上停止或暂停线程,然后在onRestart()
上重新启动或取消暂停该线程? 当我在手机上启动另一个活动时,似乎onStop()
正确停止了我的线程,但是当我尝试重新启动活动时, onRestart()
无法按预期工作并且该线程不再运行,即,我的视图已不再刷新,倒计时被冻结。 (旋转手机似乎重新启动了线程,即视图恢复刷新且倒数计时处于活动状态。)
另外, 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;
}
}
}
更改此方法:
@Override
protected void onRestart() {
super.onRestart();
refreshingThread.unpause();
}
至:
@Override
protected void onStart() {
super.onStart();
refreshingThread.start(); <-- remove from onCreate();
}
这样,您将始终在活动启动(或重新启动)时启动线程,并在活动停止时停止线程。
首先,建议刷新数据将通过从服务器推送新数据而不是将其拉出来完成-这将有助于节省电池,带宽并提高整体效率。 您可以使用GCM推送数据,例如检查: http : //www.doubleencore.com/2013/09/push-dont-poll-how-to-use-gcm-to-update-app-data/
如果您仍然希望每X秒(SLEEP_TIME)提取一次数据,我建议您使用一个Timer,可以安排它每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上将其称为onResume和onPause。
我知道了。 我将线程的pause()方法重命名为shouldStop()。 我每次都在onStart()
创建一个新线程,而每次都在onStop()
调用线程的shouldStop()方法。
private RefreshingThread refreshingThread = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
protected void onStart(){
super.onStart();
refreshingThread = new RefreshingThread();
refreshingThread.start();
}
@Override
protected void onStop(){
super.onStop();
refreshingThread.shouldStop();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.