RunOnUIThread
感觉就像Android应用程序中的UI线程只是UI线程,是否与用于整个单个应用程序中的所有活动的线程相同?
如果是这样,我必须使用Activity.RunOnUIThread
吗?还是有其他选择吗?
RunOnUiThread
在UI线程上运行代码(惊喜!)。如果当前线程是UI线程,则该代码将立即执行,否则(如果当前线程不是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);
}
从工作线程运行命令(例如小吃栏作为示例)时,将使用runonUIthread。任何影响显示的东西都应该在同一个线程上,以防止出现奇怪的瑕疵。如果你不知道,android是多线程的。它使用一个用于UI,如果你正确编程,你所做的任何处理都在不同的线程上。这样你的界面总是很平滑。
是否与用于整个单个应用程序中的所有活动的线程相同?
Android中的线程比你想象的要简单,一般来说,任何应用程序都可以拥有n
线程数,但只有一个UI线程。进行所有UI相关更改的线程称为UI线程。使用RunOnUIThread
如果当前线程是UI线程,则该代码将立即执行,否则(如果当前线程不是UI线程),代码将在UI线程的事件队列中排队。如果您在UI中进行任何更改,并且它在某个后台线程中,如async-await
基于Restful Api
call那么它将不会被反映,因为这不是在后台线程上进行的,因此运行的'Activity'不知道id由于RunOnUIThread
仅在片段中的活动上下文中可用,因此您需要使用Activity属性来获取并使用它。
如果是这样,我必须使用Activity.RunOnUIThread吗?还是有其他选择吗?
它并不总是需要,但有些情况下你可能想要使用它。 (如上所述)
例如:在完成执行后打开弹出窗口的异步方法将需要RunOnUIThread
方法,否则您的弹出窗口或警报将永远不会显示,因为更改不是在UIThread上进行的,而是异步后台线程。
类似地,如果你有一个OnCreate
方法,如果你决定直接在OnCreate
方法中将它写下来,你需要在页面打开后立即显示警报,在这种情况下你可能不会显示它UIThread。()