首先现总结一下他的使用方式,一般情况下我们使用最多的就是如下这种方式:
public class Main2Activity extends AppCompatActivity {
private TextView textView;
private Handler mHandler=new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
switch (msg.what){
case 0:
textView.setText((String)msg.obj);
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
textView=findViewById(R.id.textVIew);
new Thread(new Runnable() {
@Override
public void run() {
//设置消息
Message message=new Message();
message.what=0;
message.arg1=0;
message.arg2=0;
message.obj="abc";
//发送消息
mHandler.sendMessage(message);
}
}).start();
}
}
首先在主线程新建一个handler对象并在内部实现handleMessage()方法,内部实现消息处理的逻辑,一般内部都是进行ui更新操作,然后再子线程中创建一个message对象并设置相关属性,最后就是通过调用handler的sendMessage将消息发送出去。
之前是在子线程发送消息主线程处理消息,但是都能在主线程发送消息,然后在子线程处理吗?答案是能的,但是不能进行ui操作,否则会报一个错误.
public class Main2Activity extends AppCompatActivity {
private TextView textView;
private Handler mHandler=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
textView=findViewById(R.id.textVIew);
}
public void create(View view){
//开启子线程
new MyThread().start();
}
public void send(View view){
//创建消息对象
Message message=new Message();
message.what=0;
message.obj="主线程中传递来的数据";
//将消息发送到子线程
mHandler.sendMessage(message);
}
//创建子线程
class MyThread extends Thread{
@Override
public void run() {
Looper.prepare();
mHandler=new Handler(){
//处理从主线程发送过来的消息
@Override
public void handleMessage(@NonNull Message msg) {
switch (msg.what){
case 0:
System.out.println(msg.obj);
textView.setText((String)msg.obj);
break;
}
}
};
Looper.loop();
}
}
}
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
翻译过来就是只有创建视图层次结构的原始线程才能触摸其视图。就是说只有主线程才能进行ui操作