1. 程式人生 > >FC 10.2 多執行緒程式設計及Handler訊息非同步處理機制

FC 10.2 多執行緒程式設計及Handler訊息非同步處理機制

  • 執行緒的基本用法
  • 在子執行緒中更新UI
    • Handler訊息非同步處理機制
    • Handler訊息非同步處理個人理解

 

執行緒用於執行比較耗時的操作。

執行緒的基本用法有三個(常用第三種)

1、新建類繼承Thread,重寫父類的run()方法,在裡邊執行對應的邏輯。使用時,new這個類的例項,呼叫start()方法。

class MyThread extends Thread {
    @Override
    public void run() {
        //新增事件
    }
}


//使用時:
MyThread s = new MyThread();
s.start();

2、新建類實現Runnable介面,實現run()方法。(啟動執行緒時,與第一種方式不同)

class myThread implements Runnable{
    @Override
    public void run() {
     //新增事件   
    }
}

//使用時
MyThread myThread = new MyThread();
new Thread(myThread).start();

3、不想建立類,可以使用匿名內部類的方式。(常用)

new Thread(new Runnable() {
    @Override
    public void run() {
        //新增事件
    }
}).start();

在子執行緒中更新UI

Android的UI是執行緒不安全的,即要想改變UI中的元素,必須在主執行緒中操作,否則就會出現異常。

解決方案:使用Handler訊息非同步處理機制。

  1. 定義UPDATE_TEXT常量用於表示更新textview的動作
  2. 新增一個Handler物件,重寫父類的handleMessage()方法,這裡對具體的message進行處理(如我們要修改textview的文字)
  3. 按鈕的單擊事件:新建一個子執行緒,建立Message物件,將what欄位設定為UPDATE_TEXT,然後呼叫handler的sendMessage方法。
  4. (Handler接收到這條message,對攜帶的what值進行判斷,進而進行UI操作)
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private static final int UPDATE_TEXT = 1;
    private Button btn;
    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = (Button) findViewById(R.id.btn);
        textView = (TextView) findViewById(R.id.textview);
        btn.setOnClickListener(this);
    }
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case UPDATE_TEXT:
                    textView.setText("我被更改了!");
                    Toast.makeText(getApplicationContext(), "我被更改了", Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    };
    @Override
    public void onClick(View v) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                Message message = new Message();
                message.what = UPDATE_TEXT;
                handler.sendMessage(message);
            }
        }).start();
    }
}

Handler訊息非同步處理個人理解

我個人是這麼理解的:教室裡有相應的規章制度,教室外邊的人A不能修改教室裡邊的規章制度,但是A可以找一個線人來幫忙,A告訴線人,讓線人告訴教室裡的人,然後教室裡的人就可以修改規章制度了。(個人理解,如有錯誤,不嗇賜教!嚴肅臉.jpg)