为啥我可以从 android 中的另一个线程更新视图?

Posted

技术标签:

【中文标题】为啥我可以从 android 中的另一个线程更新视图?【英文标题】:why can i update view from another thread in android?为什么我可以从 android 中的另一个线程更新视图? 【发布时间】:2021-11-13 11:32:57 【问题描述】:

我有一个代码:

new Thread()
    @Override
    public void run() 
        btn.setText("Test");
    
.start();

此代码有效。但是如果我让sleep(2000); 然后抛出错误

new Thread()
    @Override
    public void run() 
        try 
            Thread.sleep(2000);
         catch (InterruptedException e) 
            e.printStackTrace();
        
        btn.setText("Test");
    
.start();

// =>> Only the original thread that created a view hierarchy can touch its views.

那么谁能告诉我造成这种差异的原因是什么?我了解不允许从另一个线程更新 UI。

【问题讨论】:

【参考方案1】:

您只能在主踏板中更新 UI 踏板。您只需要在主线程中调用btn.setText("Test");。对于此类行为,您需要使用HandlerLooper

    使用btn.setText("Test"); 创建可运行文件。
    Runnable myRunnable = new Runnable() 
        @Override 
        public void run() 
            btn.setText("Test");
        
    ;
    用主线程的 Looper 创建 Handler。
    Handler mainHandler = new Handler(Looper.getMainLooper());
    更新用户界面需要调用mainHandler.post(myRunnable)
new Thread()
    @Override
    public void run() 
        try 
            Thread.sleep(2000);
         catch (InterruptedException e) 
            e.printStackTrace();
        
        mainHandler.post(myRunnable);
    
.start();

【讨论】:

我理解你。但是我尝试像第一个代码一样在另一个线程中更新它,但它仍然有效。我想知道为什么它仍在运行而没有错误消息?谢谢。

以上是关于为啥我可以从 android 中的另一个线程更新视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Web 应用程序中的另一个线程更新变量?

无法从使用 c# 在不同线程上运行的另一个页面 User.cs 更新 GUI (MainWindow.xaml) 中的进度条

android编程为啥要更新界面?怎么更新?

向同一进程中的另一个线程发出信号

为啥loop之后就可以子线程更新ui

从 Access 中的另一个表返回值时,为啥我的查询运行如此缓慢?