RunOnUIThread
感觉就像Android应用程序中的UI线程只是UI线程,
整个应用程序中用于所有活动的线程是否相同?
如果是,我必须使用Activity.RunOnUIThread
吗?
还是有其他选择?
答案 0 :(得分:1)
RunOnUiThread
在UI线程(惊奇!)上运行代码。如果当前线程是UI线程,则该代码将立即执行;否则(如果当前线程是 not UI线程),则代码将在UI线程的事件队列。
UI线程是执行的主线程,大多数代码都在其上运行。 (实际上,任何更改UI的代码都应在UI线程上运行)
我必须使用
Activity.RunOnUIThread
吗?
在非UI线程(例如,后台线程)中时,您必须使用RunOnUIThread
。
还是有其他选择?
如果您的意思是还有其他强制代码在UI线程上运行的方法,那么我认为您可以使用Handler
。 (这可能会帮助:Why to use Handlers while runOnUiThread does the same? )
奖励:这是我与问题相关的2种辅助方法:
public bool IsMainThread
=> Build.VERSION.SdkInt >= BuildVersionCodes.M
? Looper.MainLooper.IsCurrentThread
: Looper.MyLooper() == Looper.MainLooper;
public void RunOnMainThread(Action action)
{
if (IsMainThread) action();
else RunOnUiThread(action);
}
答案 1 :(得分:0)
当您从工作线程运行命令(例如,小吃店等)时,将使用runonUIthread。任何影响显示的内容都应该在同一线程上,以防止出现怪异的伪影。以防万一您不知道,Android是多线程的。它使用一个用于UI,如果正确编程,则所做的任何处理均在不同的线程上。这样,您的界面将始终保持顺滑状态。
答案 2 :(得分:0)
在单个应用程序中用于所有活动的线程是否相同?
与您可能认为的相比,Android中的线程更简单,通常任何应用程序都可以具有n
个线程,但是只有一个UI线程。进行所有与UI相关的更改的线程称为UI线程。使用RunOnUIThread
时,如果当前线程是UI线程,则该代码将立即执行;否则(如果当前线程不是UI线程),该代码将在UI线程的事件队列中排队。如果您在用户界面中进行了任何更改,并且在诸如基于async-await
的{{1}}调用之类的后台线程中进行了更改,则该更改将不会得到反映,因为它不是在后台线程上进行的,因此正在运行的“活动”未知的ID,因为Restful Api
仅在活动上下文中的片段中可用,您将需要使用Activity属性来获取和使用它。
如果是,是否必须使用Activity.RunOnUIThread?还是有其他选择?
并非总是需要它,但是在某些情况下您可能想使用它。 (如上所述)
例如:一个异步方法在完成执行后打开弹出窗口将需要RunOnUIThread
方法,否则您的弹出窗口或警报将永远不会显示,因为更改不是在UIThread上进行的,而是异步后台线程
类似地,如果您有RunOnUIThread
方法,并且要求立即打开页面,则立即显示警报,如果您决定直接以OnCreate
方法写下来,则有机会在这种情况下,您可能无法在UIThread上运行它。()