和許多其他的GUI 庫一樣,Android 的UI 也是線程不安全的。也就是說,如果想要更新應用程序里的UI 元素,則必須在主線程中進行,否則就會出現異常。了解AsyncTask的用法,請參見我的博客:(android高級---->Asynctask的源碼分析)今天我們就來學習一下有關UI更新的一些知識。
目錄:
今天我們通過一個小案例,來說明更新UI的全部測試內容:項目結構如下
在子線程中更新UI
一、 在MainActivity.java的onCreate方法中做一些初始化工作,初始化textView
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textView);
}
二、 點擊threadUpdateUI按鈕,觸發在子線程中更新UI的事件
// 在子線程中更新UI
public void threadUpdateUI(View view) {
new Thread(new Runnable() {
@Override
public void run() {
textView.setText("I love you.");
}
}).start();
}
三、 運行結果如下,說明在子線程中的確不能更新UI
- 日志打印結果: Only the original thread that created a view hierarchy can touch its views.
- 測試真機崩潰:
用Handler機制實現UI的更新
一、 定義一個Handler,用於接收處理消息
public static final int UPDATE_TEXT = 1;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case UPDATE_TEXT:
textView.setText("I Love you.");
break;
default:
break;
}
}
}
二、 點擊按鈕,觸發在子線程中發送消息的事件
// 用handler處理上述問題
public void handlerUpdate(View view) {
new Thread(new Runnable() {
@Override
public void run() {
Message message = new Message();
message.what = UPDATE_TEXT;
handler.sendMessage(message); // 將Message對象發送出去
}
}).start();
}
結果正常,textView顯示為:I love you
用AsyncTask機制實現UI的更新
一、 創建一個繼承AsyncTask的內部類,命名為:MyAsynTask
private class MyAsynTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
textView.setText("I love you");
}
}
二、 點擊按鈕,創建AsyncTask的實例,並調用execute方法:
// 用AsyncTask處理上述問題
public void asynTask(View view) {
MyAsynTask myAsynTask = new MyAsynTask();
myAsynTask.execute();
}
結果正常,textView顯示為:I love you。
友情鏈接
關於AsyncTask類的詳細使用,請參見我的博客 (android高級---->Asynctask的源碼分析)
作者:
huhx
出處: www.cnblogs.com/huhx
格言:你盡力了,才有資格說自己的運氣不好。
版權:本文版權歸作者huhx和博客園共有,歡迎轉載。未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,否則保留追究法律責任的權利。
出處: www.cnblogs.com/huhx
格言:你盡力了,才有資格說自己的運氣不好。
版權:本文版權歸作者huhx和博客園共有,歡迎轉載。未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,否則保留追究法律責任的權利。

