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 + "");
                }
            }
        }
  • 相关阅读:
    2017.1.10学习笔记
    v-model双向绑定
    指令之v-bind
    v-for列表渲染
    事件修饰符
    v-on
    指令v-text v-html
    vue起步
    Swoole HTTPServer
    SwooleTCP
  • 原文地址:https://www.cnblogs.com/Ocean123123/p/11022543.html
Copyright © 2011-2022 走看看