安卓为什么不会抛出错误的线程异常?

4
我曾认为视图只能从主线程操纵...但是,为什么以下操作不会崩溃:
public class MainActivity extends Activity {
    TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        tv = new TextView(this);
        tv.setText("original text");
        setContentView(tv);

        new Thread(new Runnable() {
            @Override
            public void run() {
                tv.setText("trollollolol i should die here but i won't.");
            }
        }).start();        
    }
}

我在设备和模拟器上都运行了代码,两者都能正常工作并且我看到文本发生了改变。出了什么问题?

我还检查了线程ID,后台线程绝对不是主线程(threadID = 1)。


虽然我对Android UI线程的实现和检查不是很熟悉,但我不禁想知道在调用Activity.onCreate时是否存在“运行UI线程”的情况。将一个简短的Thread.sleep添加到此线程中会像预期的那样导致应用程序崩溃。 - harism
我对检查的具体实现也不熟悉(我以前确实见过一些CalledFromWrongThreadException发生)。但是通过在UI线程上运行,我假设Android可能有一些检查来检查您当前的线程ID是否为1或其他值,以免出现问题。据我所知,线程ID 1始终是“主/ UI线程”。 - David T.
这很有趣,我相信:在线程内添加Thread.sleep(1000);,在更新文本视图之前。应用程序将崩溃并抛出预期的CalledFromWrongThreadException异常。 - user656588
1个回答

1
Android并不会阻止你在主线程之外更新UI,这只是一种定时炸弹。如果主UI线程此时没有更新UI,则你的线程可以这样做。至少我是这样理解的。我不能100%确定,但我曾经(意外地)在主UI线程之外更新过UI。有时它可以工作,有时则不行。但作为良好的实践,我会使用Async task

FYI:你不需要一个Async task,你可以在另一个线程中使用runOnUiThread(Runnable)。但有时候Async确实更适合真正的后台工作。 - Peterdk
我知道。异步任务只是首选的方式。 - user2511882

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接