簡體   English   中英

我在Android中循環執行ImageView幻燈片播放后,線程仍在后台運行?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM