當 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 提供了四種常用的操作 MutilThread(多線程)的方式,分別是:
- Handler + Thread
- AsyncTask
- ThreadPoolExecutor
- IntentService
在 Android 的世界裡,Thread 分成二種:
- 單次型(Java 原有的)- 意指就是給他一件艱巨的任務,他做完就會關閉了
- 常駐型(Android 特有的)- 就是做完事情他不會自動關閉,而是變成一個 idle(閒置) 的狀態
執行緒(Thread)、迴圈器(Looper)、處理者(Handler)之間的對應關係如下:
- 1個執行緒(Thread)只能綁定 1個迴圈器(Looper),但可以有多個處理者(Handler)
- 1個迴圈器(Looper) 可綁定多個處理者(Handler)
- 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 網頁 |
沒有留言:
張貼留言