1 |
android中由於activity的線程不安全,不能把耗時操作放在主線程,而且普通子線程不能夠更新UI。
|
如果將耗時的操作放在主線程裏就會出現界面沒有反應,或是彈出強制關閉等待對話框。
在Android開發中一般將耗時的操作放在子線程裏,然後在子線程裏發送消息到消息隊列中,主線程的
Handler從消息隊列取出消息並執行相應操作(如更新UI)。
下面是一個簡單的通過子線程發送消息更新UI的例子:
xml源代碼
java源代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
代碼
```package com.example.com.wanglee.handlertest;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;
/**
*
* @author wanglee
* @function 用子線程更新UI
*
*/
public class MainActivity extends Activity {
MyHandler myHandler;//申明一個handler
TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv1);
myHandler = new MyHandler();
MyThread myThread = new MyThread();
new Thread(myThread).start();//調用線程的start()方法,開始執行線程
}
//定義一個handler使其繼承自Handler,並實現handleMessage()方法
//在handleMessage()方法裏獲取普通線程傳遞過來的數據,並更新UI
public class MyHandler extends Handler {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//獲取來自普通子線程裏的Message裏的值
Bundle b = msg.getData();
String color = b.getString("color");
String time = b.getString("time");
//改變文本框的內容
tv.setText(color + " " + time);
}
}
//定義一個普通線程,使其實現Runable接口,在裏面調用activity裏的myHandler傳遞數據
public class MyThread implements Runnable {
int i = 0;//定義一個普通變量
@Override
public void run() {
// TODO Auto-generated method stub
while (i < 15) {
String color = "red" + i;
String time = "time" + i;
//申明一個Bundle,並將要傳的數據放在裏面
Bundle bundle = new Bundle();
bundle.putString("color", color);
bundle.putString("time", time);
//聲明一個Message
//並將Bundle作爲參數
//通過調用Activity裏面申明的myHandler對象將其傳遞過去
Message message = new Message();
message.setData(bundle);
MainActivity.this.myHandler.sendMessage(message);
try
{
//讓線程休眠1秒
Thread.sleep(1000);
i++;
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
```java
代碼
|