[英]The thread keeps running in the background after I loop an ImageView slideshow in Android?
RefreshHandler refreshHandler = new RefreshHandler();
class RefreshHandler extends Handler{
@Override
public void handleMessage(Message msg) {
Level1.this.updateUI();
}
public void sleep(long delayMillis){
this.removeMessages(0);
sendMessageDelayed(obtainMessage(0), delayMillis);
}
};
public void updateUI(){
if(i<=imgid.length){
refreshHandler.sleep(100);
if(i<imgid.length){
imageView.setImageResource(imgid[i]);
imageView.setBackgroundColor(Color.WHITE);
} else if (i>=imgid.length) {
i = 0;
imageView.setImageResource(imgid[i]);
}
i++;
循環工作正常,圖像幻燈片繼續播放。 當我單擊“后退”按鈕並開始其他活動時,logcat會繼續寫消息,告訴我該線程一直在后台運行。 我該如何阻止呢? 我是編程新手,所以請不要對我苛刻,謝謝。
基本上,您需要一種方法來知道是否調用RefreshHandler的sleep方法(這是繼續“循環”的原因。)
您可以在Activity中使用布爾成員變量,並將其與Activity的onPause()/ onResume()生命周期回調關聯,以幫助您了解是否繼續幻燈片放映。
此外, 您應注意不要通過使RefreshHandler靜態(如果是內部類)並保持對Level1 Activity的WeakReference 泄漏您的Level1活動。
在這里查看有關Alex Lockwood的處理程序問題泄漏活動的出色文章:
http://www.androiddesignpatterns.com/2013/01/inner-class-handler-memory-leak.html
嘗試這樣的事情:
public class Level1 extends Activity
{
public static class RefreshHandler extends Handler
{
private WeakReference<Level1> level1Ref;
public RefreshHandler(Level1 level1)
{
super();
level1Ref = new WeakReference<Level1>(level1);
}
@Override
public void handleMessage(Message msg)
{
Level1 level1 = level1Ref.get();
if (level1 != null)
{
level1.updateUI();
}
}
public void sleep(long delayMillis)
{
this.removeMessages(0);
sendMessageDelayed(obtainMessage(0), delayMillis);
}
};
private boolean slideshowRunning = false;
private RefreshHandler refreshHandler = new RefreshHandler(this);
public void updateUI()
{
if (slideshowRunning)
{
// call refreshHandler.sleep
}
}
@Override
public void onResume()
{
super.onResume();
slideshowRunning = true;
}
@Override
public void onPause()
{
super.onPause();
slideshowRunning = false;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.