Xamarin.android 有关Activity.runUnuithRead的问题

Xamarin.android 有关Activity.runUnuithRead的问题,xamarin.android,Xamarin.android,RunOnUIThread感觉Android应用程序中的UI线程就是UI线程, 在单个应用程序中用于所有活动的线程是否相同 如果是,我是否必须使用Activity.RunOnUIThread? 或者有其他选择吗?当您从工作线程运行命令(例如snackbar)时,会使用runonUIthread。任何影响显示的内容都应该在同一线程上,以防止出现奇怪的瑕疵。万一你不知道,android是多线程的。它对UI使用一个线程,如果您正确地编程,您所做的任何处理都是在不同的线程上进行的。这样,您的界面总是表现

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

如果是,我是否必须使用
Activity.RunOnUIThread

或者有其他选择吗?

当您从工作线程运行命令(例如snackbar)时,会使用runonUIthread。任何影响显示的内容都应该在同一线程上,以防止出现奇怪的瑕疵。万一你不知道,android是多线程的。它对UI使用一个线程,如果您正确地编程,您所做的任何处理都是在不同的线程上进行的。这样,您的界面总是表现得非常平滑

在单个应用程序中用于所有活动的线程是否相同

Android中的线程比你想象的要简单,一般来说,任何应用程序都可以有
n
个线程,但只有一个UI线程。在其上进行所有与UI相关的更改的线程称为UI线程。使用
RunOnUIThread
如果当前线程是UI线程,则该代码将立即执行,否则(如果当前线程不是UI线程),代码将在UI线程的事件队列中排队。如果您在UI中进行了任何更改,并且它位于某个后台线程中,例如基于
异步等待
Restful Api
调用,那么它将不会得到反映,因为这不是在后台线程上进行的,因此运行的“活动”不知道id,由于
RunOnUIThread
仅在片段中的活动上下文中可用,因此您需要使用activity属性获取并使用它

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

它并不总是需要的,但在某些情况下,您可能想要使用它。(如上所述)

例如:异步方法在执行完成后打开弹出窗口,需要使用
RunOnUIThread
方法,否则弹出窗口或警报将永远不会显示,因为更改不是在UIThread上进行的,而是在异步后台线程上进行的


类似地,如果您有一个
OnCreate
方法,并且如果您决定直接在
OnCreate
方法中写入该方法,您需要在页面打开时立即显示警报,那么在这种情况下,您可能无法在UIThread上运行它。(

RunOnUiThread
在UI线程上运行代码(惊奇!)。如果当前线程是UI线程,则该代码将立即执行,否则(如果当前线程不是UI线程),代码将在UI线程的事件队列中排队

UI线程是执行的主线程,大多数代码都在其上运行。(实际上,任何更改UI的代码都应该在UI线程上运行)

我是否必须使用
活动.RunOnUIThread

当您处于非UI线程(例如:后台线程)中时,必须使用
RunOnUIThread

或者有其他选择吗

如果您的意思是有没有其他方法可以强制代码在UI线程上运行,是的,我认为您可以使用
处理程序
(这可能会有帮助:)

奖励:以下是我的两个与问题相关的帮助方法:

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);
}