【问题标题】:Awaiting TaskCompletionSource across android activity navigations in C#在 C# 中跨 android 活动导航等待 TaskCompletionSource
【发布时间】:2017-02-26 21:09:31
【问题描述】:

我正在尝试创建一个可等待的方法来收集用户输入,我可以从我的 viewmodel/core 调用它。 在 android 上,我想展示一个带有输入字段和“确定”按钮的新活动。一旦用户点击 OK,用户输入活动应该被关闭并且该方法应该完成。存储和管理数据不是问题,但实际呈现用户输入活动是问题。

我有一个带有等待此方法的按钮的小项目。我可以看到一个活动过渡动画,但 MultiChoiceActivity 的(非常简单的)布局实际上从未显示。

    //### ViewModel
    public MvxAsyncCommand ShowListWithTitleCommand
    {
        get
        {
            _showListWithTitleCommand = _showListWithTitleCommand ?? new MvxAsyncCommand(() => DoShowListCommandAsync("Alt title"));
            return _showListWithTitleCommand;
        }
    }

    private async Task DoShowListCommandAsync(string title)
    {
        var bundle = new DialogServiceMultiItemsBundle(title, _allItems, _checkedItems.ToArray());
        var result = await _dialog.ShowMultipleChoice(bundle);
    }

    //### Awaitable method
    public Task<List<int>> ShowMultipleChoice(DialogServiceMultiItemsBundle bundle)
    {
        LastTcs = new TaskCompletionSource<List<int>>();
        LastBundle = bundle;

        CurrentContext.RunOnUiThread(() => {
            CurrentContext.StartActivity(typeof(MultiChoiceActivity));
        });

        return LastTcs.Task;
    }

我应该如何在活动转换中等待此方法?在方法中添加 async-await 似乎没有什么区别。

我没有成功地尝试 Task.Run() 离开 UI 线程(与上面的行为相同):

return await Task.Run<List<int>>(async () => { return await LastTcs.Task; });

【问题讨论】:

  • 我们可以假设您正在调用LastTcs.SetResult()(或来自MultiChoiceActivity 代码的LastTcs.SetException()
  • 最终我会的,是的。但是,应该在调用 SetResult() 之前触发活动导航。

标签: c# android xamarin xamarin.android mvvmcross


【解决方案1】:

我认为我从来没有以这种方式启动过超载的活动 - 我不确定你是否正确启动它。这就是我一直在做的事情,也许这就是你烦恼的关键?

var intent = new Intent (this, typeof(MultiChoiceActivity));
StartActivity (intent);

或者也许(因为它看起来像是在 MVVM 上下文中):

var intent = new Intent (CurrentContext, typeof(MultiChoiceActivity));
CurrentContext.StartActivity (intent);

这里的主要区别是使用显式Intent 来启动活动。


其他需要考虑的事项:

我很确定您在开始活动时不需要使用RunOnUiThread()

请务必在活动启动后简单地点击设备上的后退按钮进行测试 - 我不确定那里的行为是否符合您的预期。这可能永远不会让活动有机会调用SetResult()SetException(),除非您对其进行编码来处理这种情况。同样,请务必在加载或卸载该活动时抛出异常来测试它。您不希望在等待僵尸任务的情况下返回您的主要活动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多