要寫Android,難懂的多執行緒一定要給他搞懂
在Android當中,如果做超過5秒被系統強制關閉
(收到Application not Responsed簡稱ANR)
onCreate()如果做超過10秒就會跳ANR

所以繁重的事情不能在onCreate()裡頭做

有沒有解決辦法?? 就是Thread 中文叫執行緒

搞不清楚?

 

用現實的例子說明好了

 

Thread ==>  做工的工人 

Runnable ==> 要做的工作事項 (工作說明書)

 

一般的Thread,工人請他來,指定工作給他做。做完就收工閃人回家

有一種Thread,他的性質比較不一樣

算是包月的那種特約駐點工人吧,要簽合約的(笑)

上班時間跟公務員一樣,就算沒事情做也要standby在那裡

這種工人他會有個經紀人幫他管要給他作的事

 

HandlerThread ==>  特約工人

Handler ==>  特約工人的經紀人

----------------------------------------------------------------------------------

回到程式,一般來說,Activity 執行的時候

會有個 UI Thread 或叫 main Thread
就是你程式本身原有的執行緒,管著畫面呈現.....等等事物

main Thread (或叫UI Thread)就是你的程式進入點

 

而main Thread,他也是個HandlerThread

可以給他一個Handler,做接收訊息之用

----------------------------------------------------------------------------------

(以下程式碼只是示意,要表達程式碼的邏輯概念

實際上在運行的時候,模擬器的畫面不會產生任何的變化

可以把它當範本使用,稍加修改)

 

 

package com.J_Test.HandlerAndThread;

 

import android.app.Activity;

import android.os.Bundle;

import android.os.Handler;

import android.os.HandlerThread;

 

publicclass main extends Activity {

    /** Called when the activity is first created. */

    //找到UI工人的經紀人,這樣才能派遣工作  (找到顯示畫面的UI Thread上的Handler)

    private Handler mUI_Handler = new Handler();

    //宣告特約工人的經紀人

    private Handler mThreadHandler;

    //宣告特約工人

    private HandlerThread mThread;

 

    @Override

    publicvoid onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

 

       

        //聘請一個特約工人,有其經紀人派遣其工人做事 (另起一個有HandlerThread)

        mThread = new HandlerThread("name");

        //Worker待命,等待其工作 (開啟Thread)

        mThread.start();

        //找到特約工人的經紀人,這樣才能派遣工作 (找到Thread上的Handler)

        mThreadHandler=new Handler(mThread.getLooper());

       

       

        //請經紀人指派工作名稱 r,給工人做

        mThreadHandler.post(r1);

    }

   

    //工作名稱 r1 的工作內容

    private Runnable r1=new Runnable () {

        publicvoid run() {

            // TODO Auto-generated method stub

           

            //.............................

            //做了很多事

           

            //請經紀人指派工作名稱 r,給工人做

            mUI_Handler.post(r2);

           

        }

    };

    //工作名稱 r2 的工作內容

    private Runnable r2=new Runnable () {

        publicvoid run() {

            // TODO Auto-generated method stub

           

            //.............................

            //顯示畫面的動作

           

        }

    };

 

    @Override

    protectedvoid onDestroy() {

        super.onDestroy();

       

        //移除工人上的工作

        if (mThreadHandler != null) {

            mThreadHandler.removeCallbacks(r1);

        }

        //解聘工人 (關閉Thread)

        if (mThread != null) {

            mThread.quit();

        }

    }

}



---------------

2011.10.17更新新版,請前往:

http://j796160836.pixnet.net/blog/post/29895257

    全站熱搜

    Johnny 鋼鍊 發表在 痞客邦 留言(9) 人氣()