原则上只有主线程能够对View
进行操作,worker
线程不能对其操作,但有些View也可以通过worker线程来操作,比如进度条,不过主线程一般是用于接收用户的输入,以及将运算结果反馈给用户,因为如果放一些耗时长,容易阻塞的操作在主线程容易造成程序卡死,因此需要放在worker线程里
实例:线程控制进度条自动增加
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()); //在后台输出当前线程名,会发现第一次多一个线程
try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
注:
因为worker
线程无法随意修改View
,所以这里可以由handle
来实现,其在worker线程当中发送数据,然后在主线程当中取出,然后就可以修改View了
handler使用步骤
(1)定义一个Handler
:(注意导入的是android.os.Handler
)private Handler handler;
(2)新建一个handler
类,并写入接收消息方法:
class MyHandler extends Handler{
public void handleMessage(Message msg){ //方法名别打错了
String s = (String) msg.obj; //接收发送的消息
textView.setText(s); //其在主线程中,所以可以修改View
}
}
(3)实例化一个handler
(如果在主线程中实例化,那么就可以通过handler修改View了):handler = new MyHandler();
(4)在线程中发送message
,handler
中接收:
Message msg = handler.obtainMessage();
msg.obj = "abc"; //给发送的消息赋值
handler.sendMessage(msg); //将消息发送
实例:线程无法使用textView.setText()
比如:
class ButtonListener implements OnClickListener{
public void onClick(View v){
WorkThread thread = new WorkThread();
thread.start(); //这里相当于用监听器调用worker线程,然后worker线程将textView的文本改成abc,看似语法没问题,但是运行时却会报错,因为worker线程原则上无法修改View
}
}
class WorkThread extends Thread{
public void run(){
textView.setText("abc");
}
}
实例:用handler
实现上述修改View
在onCreate中:
handler = new MyHandler();
监听器、线程、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"; //给发送的消息赋值
handler.sendMessage(msg); //将消息发送
}
}
class MyHandler extends Handler{
public void handleMessage(Message msg){ //方法名别打错了
String s = (String) msg.obj; //接收发送的消息
textView.setText(s); //其在主线程中,所以可以修改View
}
}