handler机制
什么是Handler机制:是Android提供的一套更新UI的机制,可以用于发送消息和处理消息,也可以进行异步通信。
Handler中的角色
主要有handler,message,Looper,MeaasgeQueue几个角色
-
Message为Handler接受和处理的消息对象。 -
MessageQueue为消息队列以先进先出的方式管理Message。 -
Looper负责读取MessageQueue,读到之后交给发送消息的Handle进行处理。创建时会在构造器中创建MessageQueue对象。
主要是子线程中的程序使用Message夹带数据传输至handler中,完成子线程对主线程的ui更新。
? 用于子线程和主线程进行通信,一般将耗时的任务放在子线程中执行,执行完毕需要告诉主线程,就可以使用handler进行通信。
子线程中通过一个handler调用sendMessage(),将消息发送到主线程的消息队列中,主线程中handlerMessage()获得消息。
通信机制:
代码实现:
- step1 主线程中声明一个handler对象,重写handleMessage方法,在该方法中可以获得子线程传过来的数据,进行操作如更新UI
- step2 开辟一个新的线程,在里面执行一些耗时的操作,调用sendMessage方法将消息返回给主线程中
- step3 主线程收到message,执行操作
public class HandlerActivity extends Activity {
private Button btn;
private TextView tv;
private Handler handler = new Handler(Looper.myLooper()){
@Override
public void handleMessage(@NonNull Message msg) { // step1
super.handleMessage(msg);
// step3
if (msg.what == 0) {
String s = (String) msg.obj;
tv.setText(s);
Toast.makeText(HandlerActivity.this,"主线程收到消息",Toast.LENGTH_SHORT).show();
}
}
};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_handle);
initView();
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() { // step2
@Override
public void run() {
String str = getString();
Message message = new Message();
message.what = 0; // 用于标识是message来的消息
message.obj = str; // 将内容放到obj中
handler.sendMessage(message);// 将message发给主线程
}
}).start();
Toast.makeText(HandlerActivity.this,"完成",Toast.LENGTH_SHORT).show();
}
});
}
/**
* onCreate中调用,用于初始化控件
*/
private void initView() {
tv = findViewById(R.id.contente_tv);
btn = findViewById(R.id.handler_btn);
}
/**
* 模拟耗时操作
* @return
*/
private String getString(){
String result = "";
StringBuilder stringBuilder = new StringBuilder();
for (int i=0;i<100;i++){
stringBuilder.append(i);
}
try {
Thread.sleep(6000);
} catch (InterruptedException e) {
e.printStackTrace();
}
result = stringBuilder.toString();
return result;
}
}
界面
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/contente_tv"
android:text="handler"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/handler_btn"
android:text="send"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
同步和异步
当程序开始执行时,这时开启一个线程,如果所有的任务都执行在这一个线程中,那么程序就从上往下依次执行,这个是同步。 如果在程序中新开一个线程,此时就会有两个线程,两个线程在同一个时间内都在执行,此时可以能有多个任务都在执行,当有耗时的任务需要执行,如果放在主线程中,就会让主线程等待太久,如果将它放在子线程中执行,耗时任务完成后,得到的结果给主线程,这样主线程的其他任务正常执行,子线程也在执行,这是异步。
|