Xamarin Android OnOptionsItemSelected async

本文关键字:async OnOptionsItemSelected Android Xamarin | 更新日期: 2023-09-27 18:31:01

我是Xamarin和Android开发的新手(来自Web MVC背景),所以我只是尝试一些东西来学习它。无论如何,我也在努力改进 C# 中的异步任务功能,但我似乎对此有问题。

我有一个刷新菜单项,单击该菜单项时将调用天气 API 以获取最新信息,然后我想使用该数据更新 ListView。我可以毫无问题地出去获取最新数据,解析数据,并为列表项制作数组。问题是,无论我如何尝试更新适配器或列表视图,都不会发生任何事情。调试并单步执行后,似乎只要它点击适配器的 Clear 方法,它就会停止调试并继续运行应用程序(没有错误消息或我可以看到的任何内容)。

这是我的代码:

public override bool OnOptionsItemSelected(IMenuItem item)
    {
        var id = item.ItemId;
        // refresh
        if (id == Resource.Id.refresh_weather)
        {
            SetForecastInfo();
        }
        return base.OnOptionsItemSelected(item);
    }

而这个:

public async Task SetForecastInfo()
    {
        var task = new FetchWeatherTask();
        var data = await task.ExecuteAsync();
        string[] newData = new string[7];
        for (var i = 0; i < 7; i++)
        {
            // I make the new strings for the list here
        }
        _listItems = newData;
        _forecastAdapter.Clear();
        _forecastAdapter.AddAll(new List<string>(_listItems));
    }

我在 _forecastAdapter.Clear() 上放置了一个断点并检查了我的所有变量,一切看起来都很完美,并且拥有所需的所有数据。虽然如果我将鼠标悬停在 Clear() Visual Studio 调试器上说"未知成员:清除",我按 F10 进入下一个 AddAll 调用,当我这样做时,它只是继续执行,所以 AddAll 方法永远不会被调用。也不会将错误消息打印到日志中。

这是因为我无法在 OnOptionsItemSelected 中等待 SetForecastInfo 吗?我这样做是完全错误的(很可能是,只是想学习)?任何帮助不胜感激!

PS:该应用程序首次加载时,_forecastAdapter可以完美运行。它现在只是设置为静态数据,只是试图让它在刷新时更新以测试一些东西。

Xamarin Android OnOptionsItemSelected async

我最终通过摆脱所有异步内容并尝试用静态数据重新填充它来解决这个问题。这样做给了我Java.Lang.UnsupportedOperationException.在对为什么该异常会被抛在ArrayAdapter上进行一些研究后,我找到了答案。

我最初使用普通静态数组创建了 ArrayAdapter。当它尝试运行 clear 方法时,因此无法删除项目。当我第一次初始化ArrayAdapter时,切换到使用允许动态删除和添加元素(如List<string>)的集合修复了这个问题。绝对是我最初应该抓住的东西。