原則上只有主線程能夠?qū)?code>View進(jìn)行操作撤嫩,worker
線程不能對其操作困后,但有些View也可以通過worker線程來操作杨耙,比如進(jìn)度條,不過主線程一般是用于接收用戶的輸入巷疼,以及將運(yùn)算結(jié)果反饋給用戶晚胡,因?yàn)槿绻乓恍┖臅r長,容易阻塞的操作在主線程容易造成程序卡死,因此需要放在worker線程里
實(shí)例:線程控制進(jìn)度條自動增加
class ButtonListener implements OnClickListener{
public void onClick(View v){
MainThread thread = new MainThread();
thread.start();
}
}
class MainThread extends Thread{
public void run(){
for(int i = 0; i<=100; i++){
progressBar.incrementProgressBy(1);
progressBar.incrementSecondaryProgressBy(2);
System.out.println(Thread.currentThread().getName()); //在后臺輸出當(dāng)前線程名估盘,會發(fā)現(xiàn)第一次多一個線程
try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
注:
因?yàn)?code>worker線程無法隨意修改View
瓷患,所以這里可以由handle
來實(shí)現(xiàn),其在worker線程當(dāng)中發(fā)送數(shù)據(jù)遣妥,然后在主線程當(dāng)中取出擅编,然后就可以修改View了
handler使用步驟
(1)定義一個Handler
:(注意導(dǎo)入的是android.os.Handler
)private Handler handler;
(2)新建一個handler
類,并寫入接收消息方法:
class MyHandler extends Handler{
public void handleMessage(Message msg){ //方法名別打錯了
String s = (String) msg.obj; //接收發(fā)送的消息
textView.setText(s); //其在主線程中箫踩,所以可以修改View
}
}
(3)實(shí)例化一個handler
(如果在主線程中實(shí)例化爱态,那么就可以通過handler修改View了):handler = new MyHandler();
(4)在線程中發(fā)送message
,handler
中接收:
Message msg = handler.obtainMessage();
msg.obj = "abc"; //給發(fā)送的消息賦值
handler.sendMessage(msg); //將消息發(fā)送
實(shí)例:線程無法使用textView.setText()
比如:
class ButtonListener implements OnClickListener{
public void onClick(View v){
WorkThread thread = new WorkThread();
thread.start(); //這里相當(dāng)于用監(jiān)聽器調(diào)用worker線程境钟,然后worker線程將textView的文本改成abc肢藐,看似語法沒問題,但是運(yùn)行時卻會報(bào)錯吱韭,因?yàn)閣orker線程原則上無法修改View
}
}
class WorkThread extends Thread{
public void run(){
textView.setText("abc");
}
}
實(shí)例:用handler
實(shí)現(xiàn)上述修改View
在onCreate中:
handler = new MyHandler();
監(jiān)聽器吆豹、線程、handler
class ButtonListener implements OnClickListener{
public void onClick(View v){
WorkThread t = new WorkThread();
t.start();
}
}
class WorkThread extends Thread{
public void run(){
Message msg = handler.obtainMessage();
msg.obj = "abc"; //給發(fā)送的消息賦值
handler.sendMessage(msg); //將消息發(fā)送
}
}
class MyHandler extends Handler{
public void handleMessage(Message msg){ //方法名別打錯了
String s = (String) msg.obj; //接收發(fā)送的消息
textView.setText(s); //其在主線程中理盆,所以可以修改View
}
}