标签:loop instance textview stat 发送消息 span 传递 activity extend
线程间通信的时候,比如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 + ""); } } }
标签:loop instance textview stat 发送消息 span 传递 activity extend
原文地址:https://www.cnblogs.com/Ocean123123/p/11022543.html