aaaffaewrerewrwer 2018-07-08 07:37 采纳率: 0%
浏览 1565
已结题

关于Activity退出后线程更新UI导致的严重问题

我在Activity里面开了个线程,在这个线程中有调用runOnUiThread来更新UI的操作。如下
new Thread(new Runnable() {
@Override
public void run() {
...........//耗时处理

                    myActivity.this.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            myTextView.setText("更新");
                        }
                    });
                                            ...........                       


            }
        }).start();

如果这个线程很耗时,线程运行中,用户退出了Activity ,那么这之后执行到了myActivity.this.runOnUiThread的时候,由于Activity已经被回收了,myActivity.this是null,那么会导致空指针的错误对吧。
百度了下,发现很多建议是加个判断,判断myActivity.this是否为空,如果不为空,就执行myActivity.this.runOnUiThread。也就是改为如下。
new Thread(new Runnable() {
@Override
public void run() {
...........//耗时处理
if (myActivity.this != null){
myActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
myTextView.setText("更新");
}
});
}

...........

            }
        }).start();

此方法看似合理,但是如果细想,极端情况下是有问题的。比如程序执行到 if (myActivity.this != null) 判断时 Activity没有退出,但刚好,判断完后, Activity退出了,那么下面的UI更新处理还是会出异常对吧。虽然这种极端情况出现的概率极低,但既然有可能,那么程序这么编也是不严谨的,也就是说网上大家所说的 判断myActivity.this是否为空的这种方法实际上是有问题的。这种有问题的方法在网上流传,实际是挺可怕的一件事。

但是,Thread.stop() 方法已经被弃用了,那么有什么办法能避免Activity退出后,这种线程更新UI导致的异常呢?谢谢!

  • 写回答

9条回答 默认 最新

  • qq_38179312 2018-07-08 08:22
    关注

    难道你是在主线程(UI线程)里面去处理耗时的操作?如果是,请把耗时测操作放在一个新的线程里面并使用Handler ,或者自定义回调来处理UI线程和子线程的通信

    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog