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