Android 控制線程的暫停和恢復

在Android中有時我們會遇到類似這樣的問題,我要繪製一個曲線圖,但是我想讓它可以被暫停和繼續。首先,繪圖肯定得用到多線程的知識。java的Thread類中自帶suspend和resume兩個方法來實現線程的暫停和恢復,可惜的是,現在已經不被建議使用了,而且,就算你用了,也沒什麼卵用,根本沒效果,哈哈(這就很尷尬了!)

網上查了不少資料(在這裏感謝網上一些博客的指導了),經過修改,哈,保證絕對可以用。廢話不多說,先貼代碼:

   
 private class MyThread extends Thread {
        private final Object lock = new Object();
        private boolean pause = false;
 
         /**
         * 調用這個方法實現暫停線程
         */
        void pauseThread() {
            pause = true;
        }
 
        /**
         * 調用這個方法實現恢復線程的運行
         */
        void resumeThread() {
            pause = false;
            synchronized (lock) {
                lock.notifyAll();
            }
        }
 
        /**
         * 注意:這個方法只能在run方法裏調用,不然會阻塞主線程,導致頁面無響應
         */
        void onPause() {
            synchronized (lock) {
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
 
        @Override
        public void run() {
            super.run();
            try {
                int index = 0;
                while (true) {
                // 讓線程處於暫停等待狀態
                    while (pause) {
                        onPause();
                    }
                    try {
                        System.out.println(index);
                        Thread.sleep(50);
                        ++index;
                    } catch (InterruptedException e) {
                        //捕獲到異常之後,執行break跳出循環
                        break;
                    }
                }
            } catch (NullPointerException e) {
                e.printStackTrace();
            }
        }
    }
 

 

如上代碼所示,我們使用一個鎖對象來實現線程的等待和繼續運行,這裏需要注意,使用myThread.wait()是不行的,不信可試試。還有就是onPause()方法一定只能在run方法裏面執行,不然就變成讓主線程等待了。

怎麼啓動?這個應該很簡單吧,我們在別的類中執行:

 
MyThread my = new MyThread();
Thread thread = new Thread(my);
thread.start();
 

暫停的話,只需執行:

pauseThread();

恢復線程運行:

resumeThread();
 
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章