网络编程

当前位置:永利402游戏网站-永利402com官方网站 > 网络编程 > Android解惑之Handler为什么需要是static的

Android解惑之Handler为什么需要是static的

来源:http://www.xtcsyb.com 作者:永利402游戏网站-永利402com官方网站 时间:2019-09-18 17:32

咱俩先来看一张Android Studio中的warning截图

永利402游戏网站 1handler内部存款和储蓄器泄漏.png

public class HandlerTestActivity extends Activity { private final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { // ... do something } }}

上边这段代码会挑起内部存款和储蓄器泄漏(Memory Leak)。

  • 永利402游戏网站,### 为何会唤起内部存款和储蓄器泄漏?

我们都知情,非static的中间类会持有外界类的援引,举个类子来讲,我们平常在部分里头类中显得跳转activity的时候,给Intent赋值的时候,第一个参数会写 外界类名.this ,那正是具备外界类的引用的很好展现。 一样,其余地点须求用到这几个里面类的时候,也无法是一贯new出来,因为为非static的,必须先通过new出表面类工夫。

那么,未来的处境正是,这几个非static的handler内部类,无论是还是不是是无名的,便会具备外界的activity的援用。

若此时你的handler的新闻队列中有未管理的Message,在Activity finish之后,Message仍旧存在,那么Handler也依然存在。由于Handler中有Context的援引,那么Context也就存在也就存在。而该Context就是大家的Activity,也正是Activity依旧纯在,那么大家正是发出了内部存款和储蓄器走漏。

  • ### 那么为何要写成静态内部类呢?也许写成其余独立的类呢?

隐性无名类Handler形成static的当中类,由于static的中间类,使用的应用不供给外界类的实例,所以static的里边类和表面类是未有联系的,进而不富有外部类的援引,通过这种办法,大家能够制止该种情况的产生。将隐性无名氏类写成二个独立的类(top-level-class),那样Handler和Context之间就从未有过交流了。

  • ### 如何写?

世家都晓得,写成静态类后,由于其类似于独立成为了一个类,便不能向来调用大家Activity中的一些控件了,难不成要把具有的控件都写成static的么,当然不是

小编们透过使Handler持有Activity的一个弱援用来化解这么些主题素材,直接持有Activity的话,我们便与事先的无名内部类直接持有外界类的引用没分别了,而颇具了弱引用,在Activity有用的景色下,其会被AMS持有强援用,GC不会回收,而当其finish了,便未有强援引对象具有了,此时GC时便会回收该Activity,大家的Handler由于是装有的弱引用,也不会促成其回收不成功。

来看二个差十分少的demo,大家写二个静态handler,实现5秒后修改大家布局中的textview的text。

package applock.anderson.com.statichandler;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.widget.TextView;import java.lang.ref.WeakReference;public class MainActivity extends AppCompatActivity { private TextView mTextView; private Handler mHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextView =  findViewById(R.id.tv_1); mHandler = new MyHandler; mHandler.sendEmptyMessageDelayed; } public void setTextViewText(String str) { if(mTextView != null) { mTextView.setText; } } private static class MyHandler extends Handler { WeakReference<MainActivity> mainActivityWeakReference; public MyHandler(MainActivity activity) { mainActivityWeakReference = new WeakReference<MainActivity>; } @Override public void handleMessage(Message msg) { super.handleMessage; //若Avtivity被回收,此时activity便为空 MainActivity activity = mainActivityWeakReference.get(); if(activity != null) { activity.setTextViewText; } } }}

能够看来,大家的Activity中的TextView成功被涂改了。

永利402游戏网站 2静态handler.png

  • ### 进阶

实际咱们为何要负有大家的Activity的弱引用呢,完全能够行使MVP大法,持有大家Activity完结的接口对象的弱援用,也便是多态的措施具备大家的Activity弱引用,多么美好的政工。

感激我们阅读,如有补助,来个爱好或然关怀呢!

本文作者:Anderson/Jerey_Jobs

简书地址 : Anderson大码渣CSDN地址 : Jerey_Jobs的专栏github地址 : Jerey_Jobs

本文由永利402游戏网站-永利402com官方网站发布于网络编程,转载请注明出处:Android解惑之Handler为什么需要是static的

关键词:

上一篇:没有了

下一篇:没有了