关于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导致的异常呢?谢谢!

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

不要再主线程做耗时操作,主线程更新界面UI也是报异常。常用的方法是利用 Handler 来实现 UI 线程更新的。
Handler 来根据接收的消息,处理 UI 更新。Thread 线程发出的 Handler 消息 Message ,通知更新 UI

qq_38179312 老师:不是的,我是在myActivity.this.runOnUiThread之前有耗时处理。myActivity.this.runOnUiThread里面只是简单的更新UI

qq_38179312 老师和niaonao 都去关注耗时处理了,我解释一下,
第一,耗时处理是在myActivity.this.runOnUiThread之前。myActivity.this.runOnUiThread里面只是简单的更新UI
第二,我现在发愁的核心问题是线程运行中,用户退出了Activity ,那么这之后执行到了myActivity.this.runOnUiThread的时候,由于Activity已经被回收了,myActivity.this是null,那么会导致空指针的错误。但即使加个判断myActivity.this是否为空的条件,极端
情况下也是会出错的(具体请见我问题中的说明)

这个简单,加一个变量开关就行,在onDestory里面设置其为关闭状态

为啥线程中要去更新UI呢。能不能通过发消息的方式。耗时处理在线程中。处理完成后,通过消息通知UI更新。
如果你非要在这个线程中处理。这得用线程间同步了。

chaoyangsun 兄弟,onDestory里面设开关变量的方法我知道,但开关变量的作用也只是保证线程里while不再无限循环了,本次while还是要走完吧。
那么,本次while走完前Activity还是可以先于线程销毁对吧?

我觉得应该加层try,catch吧,这样即使出现你说的极端情况,也不能使程序崩溃吧!!!

再 Activity 的OnDestory 里面进行线程的关闭销毁处理