关于Activity.RunOnUIThread的问题

时间:2019-03-17 05:08:20

标签: xamarin.android

RunOnUIThread感觉就像Android应用程序中的UI线程只是UI线程, 整个应用程序中用于所有活动的线程是否相同?

如果是,我必须使用Activity.RunOnUIThread吗? 还是有其他选择?

3 个答案:

答案 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上运行它。()