public class MainActivity extends AppCompatActivity { TextView test_text; private final MyHandler mHandler = new MyHandler(this); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); test_text = findViewById(R.id.test_text); } /** * 点击一下 去启动一个线程,在子线程中去发一条消息,通知主线程去更新UI * @param view */ public void MyTest(View view) { new MyThread().start();//启动一个线程 } //静态的匿名内部类不会持有外部类的引用 private static class MyHandler extends Handler { private final WeakReference<MainActivity> mActivty; private MyHandler(MainActivity mActivty) { //当前Activity的弱引用 this.mActivty = new WeakReference<MainActivity>(mActivty); } @Override public void handleMessage(@NonNull Message msg) { super.handleMessage(msg); MainActivity activity = mActivty.get(); if (activity != null) { switch (msg.what) { case 0: activity.test_text.setText("测试一下"); break; } Log.e("--msg--",msg.arg1+"==="+msg.arg1+"==="+msg.obj+"=="+msg.getTarget()); } } } private final class MyThread extends Thread { @Override public void run() { super.run(); //这种写法不会有新的对象生成,是从global Message pool中取,性能消耗相对少 Message message = mHandler.obtainMessage(); //会有新实例生成,需要开辟内存空间 // Message message=new Message(); //用户定义的消息代码,以便接收者能够识别此消息的内容。每个{@link处理程序}都有自己的消息代码名称空间,因此您不必担心您的处理程序与其他处理程序冲突。(源码注释的翻译) message.what = 0; //如果只需要存储几个整数值,则arg1和arg2是较低成本的替代选择。(源码注释的翻译) message.arg1 = 1; message.arg2 = 2; //要发送给收件人的任意对象. //当用于跨进程发送消息时,如果它包含一个框架类的Parcelable(不是由应用程序实现的),那么它只能是非空的。用于其他数据传输用途(源码注释的翻译) message.obj = "testString"; // 设置将接收此消息的Handler对象。 message.setTarget(mHandler); mHandler.sendMessage(message); } } //这样的写法,在Activity中容易造成内存泄漏,其原因是,非静态内部类,会持有一个外部类的隐式引用,导致 //外部类无法被回收,所以就造成了内存泄漏; // @SuppressLint("HandlerLeak") // private final Handler handler = new Handler(){ // @Override // public void handleMessage(Message msg) { // super.handleMessage(msg); // // ... // } // }; }