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 + "");
                }
            }
        }
  • 相关阅读:
    商品房买卖合同备案
    收房注意事项!--经典!
    商河水木清华业主告媒体书
    商河水木清华全体业主告开发商书
    商河县水木清华全体业主给县委县府的一封信
    大家不要在水木清华买房子了,我的都一年了,还没交房!
    呼吁所有商河水木清华业主拒绝不合理的交房流程
    说说无耻的商河水木清华开发商2013"交房
    拒绝无效的“交房”写给所有商河水木清华业主
    iframe 里的高度适应的问题
  • 原文地址:https://www.cnblogs.com/Ocean123123/p/11022543.html
Copyright © 2011-2022 走看看