首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无BeginInvokeOnMainThread Xamarin.Forms

无BeginInvokeOnMainThread Xamarin.Forms
EN

Stack Overflow用户
提问于 2016-04-14 09:42:08
回答 3查看 4.7K关注 0票数 4

很抱歉,我肯定会变成一个非常愚蠢的问题。

在我的Xamarin应用程序中,我使用的是Android而不是Xamarin表单,但我想使用Activity.RunOnUIThread (来自Android),所有Device.BeginInvokeOnMainThread文档都建议使用Device.BeginInvokeOnMainThread(来自Xamarin.Forms)项目。显然,由于我没有关于xamarin.forms项目的参考,所以我没有这个工具。

如果我不想使用表单,在哪里可以找到Xamarin中的运行ui线程机制?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-04-14 09:54:10

Android:

Android Activity有一个可以使用的RunOnUiThread方法:

代码语言:javascript
复制
RunOnUiThread  ( () => {
    // manipulate UI controls
});

参考文献:https://developer.xamarin.com/api/member/Android.App.Activity.RunOnUiThread/p/Java.Lang.IRunnable/

iOS:

代码语言:javascript
复制
InvokeOnMainThread (delegate {  
    // manipulate UI controls
});
票数 10
EN

Stack Overflow用户

发布于 2016-04-14 10:12:39

如果您想通过您的PCL /共享代码和项目中的任何其他地方来执行此操作。你有两个选择。

跨平台方式,使用本机机制

  • 将此添加到PCL中 公共类InvokeHelper {公共静态动作调用;公共静态无效调用(操作){Invoker?.Invoke(操作);}
  • 将此添加到iOS (例如,AppDelegate) 公共覆盖bool FinishedLaunching(UIApplication应用程序,NSDictionary launchOptions) { // .InvokeHelper.Invoker = InvokeOnMainThread;返回true;}
  • 将其添加到Android (例如,应用程序类) 应用程序类MainApplication :应用程序{受保护的MainApplication(IntPtr javaReference,JniHandleOwnership传输):base(javaReference,transfer) {}公共覆盖OnCreate() { base.OnCreate();InvokeHelper.Invoker = (action) => { var uiHandler =新处理程序(Looper.MainLooper);uiHandler.Post(操作);};}}

然后您就可以从共享代码中调用

代码语言:javascript
复制
InvokeHelper.Invoke(() => DoSomething("bla"));

完全跨平台方式

您也可以实现InvokeHelper跨平台。

代码语言:javascript
复制
public class InvokeHelper
{
    // assuming the static initializer is executed on the UI Thread.
    public static SynchronizationContext mainSyncronisationContext = SynchronizationContext.Current;

    public static void Invoke(Action action)
    {
        mainSyncronisationContext?.Post(_ => action(), null);
    }
}
票数 6
EN

Stack Overflow用户

发布于 2016-04-14 09:50:11

这里有一个从正式文件获得的示例

代码语言:javascript
复制
public class ThreadDemo : Activity
{
  TextView textview;

  protected override void OnCreate (Bundle bundle)
  {
      base.OnCreate (bundle);
      // Create a new TextView and set it as our view
      textview = new TextView (this);
      textview.Text = "Working..";
      SetContentView (textview);
      ThreadPool.QueueUserWorkItem (o => SlowMethod ());
  }

  private void SlowMethod ()
  {
      Thread.Sleep (5000);
      RunOnUiThread (() => textview.Text = "Method Complete");
  }
}

基本上,如果您想运行多行代码,可以这样做:

代码语言:javascript
复制
RunOnUiThread(()=>{
  MethodOne();
  MethodTwo();
});

来源

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36619293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档