Java多线程https://blog.csdn.net/qq_45923275/article/details/119295978?spm=1001.2014.3001.5502https://blog.csdn.net/qq_45923275/article/details/119295978?spm=1001.2014.3001.5502? ? ? ? 更新ui的操作推荐交给创建这个ui的原始线程来操作,原因是如果给ui加锁保证它的线程安全性,会降低访问效率,而在线程不安全的ui中通过多个线程进行操作会出现不可控的情况。
? ? ? ? 安卓推荐使用Handler来实现异步处理,从而规避线程不安全的问题。在安卓中的异步消息处理机制中有四个角色,Message是消息的封装,整型属性属性what用于标识消息类型,org属性用于传递对象。Handler用于处理消息,可以传入一个包含handleMessage方法的回调接口。MessageQueue是消息队列,用于存储Handler发送的消息,单个线程只能有一个消息队列。
Looper是循环器的意思,开启loop方法后会不断从消息队列中读取新消息然后回调dispatchMessage方法。具体来说,Looper开启loop方法会不断调用looponce方法,在其中会尝试调用msg的target对象(Handler)的回调接口中的方法.
TextView textView=findViewById(R.id.text);
//传入回调接口中的值是handleMessage函数
Handler handler=new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message msg) {
switch (msg.what){
case 1:
textView.setText((String)msg.obj);
}
return true;
}
});
//开个子线程,向母线程handler发送一个值为1包含一个字符串对象的消息。
new Thread(()->{
findViewById(R.id.button).setOnClickListener(v -> {
Message message=new Message();
message.what=1;
message.obj="nmsl";
handler.sendMessage(message);
});
}).start();
Android提供了异步消息处理机制的封装类,即Async(异步)Task类,可以避免直接使用Handler等类来进行ui更新
|