【问题标题】:Xamarin Android - Only the original thread that created a view hierarchy can touch its viewsXamarin Android - 只有创建视图层次结构的原始线程才能触摸其视图
【发布时间】:2018-01-05 16:06:11
【问题描述】:

当按下登录按钮时,尽管按钮中已经使用了异步来运行任务并且代码是正确的,但它会抛出一个提到的错误。

token = await Task.Run(() => { return core.SignIn(username.Text, password.Text); }).ConfigureAwait(false);

【问题讨论】:

  • 您的函数中的某些内容正在从主线程以外的线程进行 UI 更改。这在 Android 中是不允许的。解决方案是在主线程上进行这些更改。

标签: android xamarin xamarin.android


【解决方案1】:

您正在尝试与主调度程序从任务中创建的 UI 元素进行交互。

token = await Task.Run(() => 
{ 
    return core.SignIn(username.Text, password.Text); 
}).ConfigureAwait(false);

需要类似于:

token = await Task.Run(() => 
{ 
    Activity.RunOnUiThread(()=>{
        return core.SignIn(username.Text, password.Text); 
    });
}).ConfigureAwait(false);

编辑:

基于您从 EditText 控件获取用户名和密码的假设进行轻微调整:

token = await Task.Run(() => 
{ 
    string usernm = string.Empty;
    string pass = string.Empty;

    Activity.RunOnUiThread(()=>{
          usernm = username.Text;
          pass = password.Text;
    });

    return core.SignIn(usernm, pass);
}).ConfigureAwait(false);

【讨论】:

  • 匿名函数转换为 void 返回委托不能在您提到的代码上返回值(返回)。
  • 这是您的代码,我所做的只是将主要操作包装在主调度程序委托中。你真的试过了吗?
猜你喜欢
  • 2016-01-17
  • 1970-01-01
  • 2015-05-22
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多