Handlerthread使用
Posted ocean123123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Handlerthread使用相关的知识,希望对你有一定的参考价值。
线程间通信的时候,比如android中常见的更新UI,涉及到的是子线程和主线程之间的通信,实现方式就是Handler+Looper,但是要自己手动操作Looper,不推荐,所以谷歌封装了HandlerThread类(类似于AsyncTask类)。
子线程执行完任务发送消息给子线程的handler,子线程的Handler再利用HandlerThread发送消息给主线程更新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 + "");
以上是关于Handlerthread使用的主要内容,如果未能解决你的问题,请参考以下文章
Android源代码解析之-->HandlerThread