为了账号安全,请及时绑定邮箱和手机立即绑定

Handler声明称静态内部类,实例化报错

Handler声明称静态内部类,实例化报错

白猪掌柜的 2019-03-13 14:15:04
安卓开发实现下载进度条在使用Handler更新UI的时候,我是这样写的handler = new Handler(){        @Override        public void handleMessage(Message msg) {            progressBar.setProgress((Integer)msg.obj);            textView.setText("已下载"+msg.obj+"%");        }        };编译器给出了这样的警告This Handler class should be static or leaks might occur查询资料后,使用静态内部类 private static class MyHandler extends Handler {        private final WeakReference<MainActivity> mActivity;        public MyHandler(MainActivity activity) {            mActivity = new WeakReference<MainActivity>(activity);        }    @Override    public void handleMessage(Message msg) {        if (mActivity.get() != null) {        }    }}实例化MyHandller的时候依旧给出这样的警告This Handler class should be static or leaks might occur以及我的静态内部类声明有问题吗?完整的代码public class MainActivity extends AppCompatActivity {    private ProgressBar progressBar;    private TextView textView;    private int downloadStatus = 0;    private static class MyHandler extends Handler {        private final WeakReference<MainActivity> mActivity;        public MyHandler(MainActivity activity) {            mActivity = new WeakReference<MainActivity>(activity);        }        @Override        public void handleMessage(Message msg) {            if (mActivity.get() != null) {            }        }    }    private static MyHandler handler;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        progressBar = (ProgressBar) findViewById(R.id.progressBar);        textView = (TextView) findViewById(R.id.textShow);        handler = new MyHandler(this) {            public void handleMessage(Message msg) {                progressBar.setProgress((int) msg.obj);                textView.setText("已下载" + msg.obj + "%");            }        };        new MyThread().start();    }
查看完整描述

3 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

你为什么要写了Handler类之后还要重新new出来一个继承MyHandler的类,你把dispatchMessage要做的事情直接放到MyHandler里就可以了。


查看完整回答
反对 回复 2019-04-18
?
哔哔one

TA贡献1854条经验 获得超8个赞

不要在new MyHandler()继承重写,把操作直接定义在MyHandler的定义中。

另外 private static MyHandler handler; 这句不要使用静态化定义,直接定义成 private MyHandler handler;


查看完整回答
反对 回复 2019-04-18
?
HUX布斯

TA贡献1876条经验 获得超6个赞

https://img1.sycdn.imooc.com//5cb7edfd0001a78105080171.jpg

这个地方会导致内存泄漏啊,引用了外部类的变量了,导致他没法释放啊。你对内存泄漏不了解吧。

查看完整回答
反对 回复 2019-04-18
  • 3 回答
  • 0 关注
  • 922 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信