为啥我可以从 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");
。对于此类行为,您需要使用Handler
和Looper
。
-
使用
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 中的另一个线程更新视图?的主要内容,如果未能解决你的问题,请参考以下文章
无法从使用 c# 在不同线程上运行的另一个页面 User.cs 更新 GUI (MainWindow.xaml) 中的进度条