FC 10.2 多執行緒程式設計及Handler訊息非同步處理機制
阿新 • • 發佈:2018-11-24
- 執行緒的基本用法
- 在子執行緒中更新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訊息非同步處理機制。
- 定義UPDATE_TEXT常量用於表示更新textview的動作
- 新增一個Handler物件,重寫父類的handleMessage()方法,這裡對具體的message進行處理(如我們要修改textview的文字)
- 按鈕的單擊事件:新建一個子執行緒,建立Message物件,將what欄位設定為UPDATE_TEXT,然後呼叫handler的sendMessage方法。
- (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)