2022年2月20日 星期日

Android Studio - Thread 基本介紹(四十六):

Android Studio - Thread 基本介紹(四十六):

當 Android 啟動一個程式時,Android 系統會啟動一個 Process,Process 會預設創建一個 Thread(線程 / 執行緒)用於處理主線程(Main Thread)所有 Message 物件的 Looper 物件,它的生命週期貫穿于整個應用生命週期,亦稱為 UI Thread 或 Main Thread,Thread 是指一串連續的執行動作,以達成目的。如編寫耗時的工作代碼在程式中,最好另起線程執行放在背景執行,免得 UI(User Interface)線程與其他邏輯的執行,從而導致界面卡頓。如果卡頓時間超過 5秒,系統就會報 ANR(Application No Responding)錯誤。

Android Studio 的基本 Thread 圖片來源:AndroidWave 網頁
簡單而言,在 Android 系統預設情況下,一個應用程式內的各個元件(如 Activity、Service、BroadcastReciver 等)都會在同一個進程(Process)內執行,且由此進程的主線程負責執行。如果有特別指定(通過 android:process),也可以讓特定元件在不同的進程中運行。主線程可以創建多個子線程來處理後台服務工作,主線程會專心處理UI的事件。子線程的任務則是執行耗時任務,比如網路請求,I/O 操作等,避免出現 ANR 現象。

Android 提供了四種常用的操作 MutilThread(多線程)的方式,分別是:
  1. Handler + Thread
  2. AsyncTask
  3. ThreadPoolExecutor
  4. IntentService

在 Android 的世界裡,Thread 分成二種:
  1. 單次型(Java 原有的)- 意指就是給他一件艱巨的任務,他做完就會關閉了
  2. 常駐型(Android 特有的)- 就是做完事情他不會自動關閉,而是變成一個 idle(閒置) 的狀態

執行緒(Thread)、迴圈器(Looper)、處理者(Handler)之間的對應關係如下:
  1. 1個執行緒(Thread)只能綁定 1個迴圈器(Looper),但可以有多個處理者(Handler)
  2. 1個迴圈器(Looper) 可綁定多個處理者(Handler)
  3. 1個處理者(Handler) 只能綁定1個1個迴圈器(Looper)

Thread 程式:

public class MainActivity extends Activity {

 

    Thread countToTen;

 

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

       

        countToTen = new CountToTen();

        countToTen.start();

    }

 

    class CountToTen extends Thread {

 

        @Override

        public void run() {

            // TODO Auto-generated method stub

            super.run();

            try {

                for (int i = 0; i < 10; i++) {

                    Thread.sleep(1000);

                }

            } catch (Exception e) {

                 e.printStackTrace();

            }

        }

    }

}


Thread + Runnable 程式:

public class MainActivity extends Activity {

 

    Thread countToTen;

 

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

       

        new Thread(new Runnable() {

  

            public void run() {

                // TODO Auto-generated method stub

                // 您要在執行緒作的事

                            }

        }).start();

    }

}


Thread + Handler + Runnable 程式:

public class MainActivity extends Activity {

 

    Thread countToTen;

 

    TextView txtCount;

 

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

       

        txtCount = (TextView) findViewById(R.id.txtCount);

       

        countToTen = new CountToTen();

        countToTen.start();

    }

 

    private Handler mHandler = new Handler() {

        public void handleMessage(Message msg) {

            super.handleMessage(msg);

            txtCount.setText(Integer.toString(msg.getData().getInt("count", 0)));

        }

    };

   

    class CountToTen extends Thread {

 

        @Override

        public void run() {

            // TODO Auto-generated method stub

            super.run();

            try {

                for (int i = 0; i < 10; i++) {

                    Thread.sleep(1000);

                    Bundle countBundle = new Bundle();

                    countBundle.putInt("count", i+1);

    

                    Message msg = new Message();

                    msg.setData(countBundle);

    

                    mHandler.sendMessage(msg);

                }

            } catch (Exception e) {

                e.printStackTrace();

            }

        }

    }

}


中斷程式:

@Override

protected void onPause() {

    // TODO Auto-generated method stub

    super.onPause();

 

    if (countToTen != null) {

        if (!countToTen.isInterrupted()) {

            countToTen.interrupt();

        }

    }

}


Android Studio 的基本 Thread 圖片來源:codepath 網頁
2022年 2月 20日(Sun)天氣報告
氣溫:39.0°F / 4.0°C @ 07:00
風速:每小時 10公里
降雨機會:15%
相對濕度:百分之 89%
天氣:多雲

沒有留言:

張貼留言