IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 2021-08-17 -> 正文阅读

[移动开发]2021-08-17

handler机制

什么是Handler机制:是Android提供的一套更新UI的机制,可以用于发送消息和处理消息,也可以进行异步通信。

Handler中的角色

主要有handler,message,Looper,MeaasgeQueue几个角色

  • Message为Handler接受和处理的消息对象。

  • MessageQueue为消息队列以先进先出的方式管理Message。

  • Looper负责读取MessageQueue,读到之后交给发送消息的Handle进行处理。创建时会在构造器中创建MessageQueue对象。

主要是子线程中的程序使用Message夹带数据传输至handler中,完成子线程对主线程的ui更新。

? 用于子线程和主线程进行通信,一般将耗时的任务放在子线程中执行,执行完毕需要告诉主线程,就可以使用handler进行通信。

子线程中通过一个handler调用sendMessage(),将消息发送到主线程的消息队列中,主线程中handlerMessage()获得消息。

通信机制:

handler的通信机制

代码实现:

  • 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>

同步和异步

当程序开始执行时,这时开启一个线程,如果所有的任务都执行在这一个线程中,那么程序就从上往下依次执行,这个是同步。
如果在程序中新开一个线程,此时就会有两个线程,两个线程在同一个时间内都在执行,此时可以能有多个任务都在执行,当有耗时的任务需要执行,如果放在主线程中,就会让主线程等待太久,如果将它放在子线程中执行,耗时任务完成后,得到的结果给主线程,这样主线程的其他任务正常执行,子线程也在执行,这是异步。

同步异步

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-18 12:49:12  更:2021-08-18 12:50:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 9:36:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码