【问题标题】:How to update the UI without blocking input from user in Xamarin Android?如何在不阻止 Xamarin Android 中用户输入的情况下更新 UI?
【发布时间】:2018-12-28 07:22:32
【问题描述】:

listview 正在加载时,我的应用程序被阻止接受用户输入,当这种情况发生时,backpress 和按钮不起作用。

public void OnAnimationEnd(Animation animation)
{
       Task.Run(() => RunOnUiThread(dodo));
}

下面的代码在动画结束时运行

public void dodo()
{
        AdRequest adRequest = new AdRequest.Builder().AddTestDevice(AdRequest.DeviceIdEmulator).Build();
        adView.LoadAd(adRequest);
        AccessFiles();

        adapter = new MyArryAdapter(this, Resource.Layout.AdaptView, CustomView.multipleData.ToList());
        listView.Adapter = adapter;


        adapter.NotifyDataSetChanged();
        pb.Visibility = ViewStates.Gone;
}

【问题讨论】:

  • 适配器的分配等项目必须在 UI 线程上完成,但适配器的创建不会,不确定 AccessFiles() 的作用,但它是否依赖于 UI 上下文?等。 ....
  • 不,它只是检查文件是否存在,如果不存在,它会将文件写入文件系统

标签: c# android xamarin asynchronous xamarin.android


【解决方案1】:

试试这个(抱歉,我现在没有时间测试它,因为我正在等待构建完成时查看问题):

public async void OnAnimationEnd(Animation animation)
{
    await Task.Run(() => Dodo()).ConfigureAwait(false);
    RunOnUIThread(AssignDodoAdapter());
}

void Dodo()
{
    AdRequest adRequest = new 
 AdRequest.Builder().AddTestDevice(AdRequest.DeviceIdEmulator).Build();
    adView.LoadAd(adRequest);
    AccessFiles();
    adapter = new MyArryAdapter(this, Resource.Layout.AdaptView,  CustomView.multipleData.ToList());
}

void AssignDodoAdapter()
{
    listView.Adapter = adapter;
    adapter.NotifyDataSetChanged();
    pb.Visibility = ViewStates.Gone;
}

注意:我假设适配器、列表视图等作为可能被引用的字段公开,如您的代码示例中所示。

OnAnimationEnd() 应该被标记为异步。它应该在后台(非 UI)线程上运行 Dodo() 中的代码,从而允许在 UI 线程上处理其他事件,但由于它处于等待状态,它不会继续到下一个代码块。任务完成后,它应该在 UI 线程上运行 AssignDodoAdapter() 中的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多