zoukankan      html  css  js  c++  java
  • Handlerthread使用

    线程间通信的时候,比如Android中常见的更新UI,涉及到的是子线程和主线程之间的通信,实现方式就是Handler+Looper,但是要自己手动操作Looper,不推荐,所以谷歌封装了HandlerThread类(类似于AsyncTask类)。

    子线程执行完任务发送消息给子线程的handler,子线程的Handler再发送消息给主线程更新ui 

    public class MainActivity extends AppCompatActivity {
    
        TextView textView;
        Button button;
        MainHandler mainHandler;
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            textView = findViewById(R.id.text);
            button = findViewById(R.id.button);
            //这个是主线程Handler 实例 还有一个知识点就是如果new Handler时候没有给她传递looper的话,他会默认的去当前运行线程的looper进行联系
            mainHandler = new MainHandler(this);
    
    
            HandlerThread handlerThread = new HandlerThread("first");
            handlerThread.start();
            //这是子线程联系的handler 传入了handlerThread的looper
            final Handler childHandler = new Handler(handlerThread.getLooper()) {
                int count = 0;
    
                @Override
                public void handleMessage(Message msg) {
                    super.handleMessage(msg);
                    System.out.println("子线程 的handler 接受到数据  现在 将数据发送给 主线程 执行 " + Thread.currentThread().getName());
                    //发送消息给 主线程的handler 让她更新ui
                    Message.obtain(mainHandler, 1, ++count).sendToTarget();
                }
            };
    
    
            // 开启一个子线程 调用childHandler 发送信息
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            System.out.println("子线程发送数据 " + Thread.currentThread().getName());
                            //发送给handlerThread的handler
                            childHandler.sendEmptyMessage(1);
                        }
                    }).start();
                }
            });
    
        }
            //这个是主线程的Handler 定义成这种形式,可以防止内存泄露
            class MainHandler extends Handler {
                private WeakReference<MainActivity> mainActivityWeakReference;
    
                MainHandler(MainActivity mainActivity) {
                    this.mainActivityWeakReference = new WeakReference<>(mainActivity);
                }
    
                @Override
                public void handleMessage(Message msg) {
                    super.handleMessage(msg);
                    mainActivityWeakReference.get().textView.setText(msg.obj + "");
                }
            }
        }
  • 相关阅读:
    LeetCode:25 K个一组翻转链表
    LeetCode:3 无重复字符的最长子串(双指针)
    Java——参数问题与final实例域
    Java——对象的构造
    配置远程服务器 安装iis 远程服务器网络无法连接
    未能找到元数据文件
    ef 设计model 标签
    visualsvn for vs2017 初始化错误
    resharper 2018.2.3破解
    C# winform 自定义函数中找不到Form中的控件和定义的全局变量
  • 原文地址:https://www.cnblogs.com/Ocean123123/p/11022543.html
Copyright © 2011-2022 走看看