Android多线程消息处理机制 - Handler机制
Android的主线程不能进行耗时操作,耗时操作放在子线程执行
在子线程中只能进行一些耗时的操作,而不能直接操纵UI,只能由主线程操作。
Handler异步通信系统
handler是Android给我们提供用来更新UI的一套机制,也是一套消息处理机制,我们可以发消息,也可以通过它处理消息。
Handler机制主要的几个角色:Handler、Message、Looper、MessageQueue(消息队列)主线程在一开始就建立了如下系统:
Handler多线程通信机制
在布局文件制作一个文本框,用来显示接受的数据
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginRight="10dp"android:orientation="vertical"android:paddingLeft="10dp"><TextViewandroid:id="@+id/tv_content"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="结果"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:text="开始"android:onClick="start"android:textAllCaps="false"/></LinearLayout></LinearLayout>
Activity.java
package com.tinno.handler;import androidx.annotation.NonNull;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;import android.os.Handler;import android.os.Looper;import android.os.Message;import android.view.View;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends AppCompatActivity {private TextView tvContent;String strFromNet;/*** Looper.myLooper() ==> 取主线程自己的一个 Looper*/private Handler mHandler = new Handler(Looper.myLooper()){//需要一个处理消息的方法@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);// 处理发送的消息if (msg.what == 0){// 从消息中取出真正的数据String strData = (String) msg.obj;//从主线程中显示消息tvContent.setText(strData);Toast.makeText(MainActivity.this,"主线程收到消息了!",Toast.LENGTH_LONG).show();}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tvContent = (TextView) findViewById(R.id.tv_content);}public void start(View view){// 做一个耗时任务// 开启一个子线程new Thread(new Runnable() {// 线程之内的东西什么时候执行由子线程决定@Overridepublic void run() {// 子线程只执行方法里面的内容String stringFromNet = getStringFromNet();// 怎么将字符串传给子线程// 需要一个消息对象,new一个Message message = new Message();message.what = 0; //message.what 用来区分是谁发送的消息message.obj = stringFromNet; // 将需要进行的修改赋值给消息// 发送消息mHandler.sendMessage(message); // ==> 之后给全局变量的mHandler进行消息处理}}).start();Toast.makeText(this,"任务完成",Toast.LENGTH_LONG).show();}private String getStringFromNet(){// 假装从网络获取了一个字符串String result = "";StringBuffer stringBuffer = new StringBuffer();//模拟一个耗时操作for (int i = 0; i < 100; i++) {stringBuffer.append(i + "字符串");}try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}result = stringBuffer.toString();return result;}}
效果图
点击开始按钮,Toast显示 任务完成 , 经过 3s 界面出现消息内容,当消息显示完毕,Toast显示 主线程接受到消息
如果觉得《Android多线程消息处理机制 - Handler机制》对你有帮助,请点赞、收藏,并留下你的观点哦!