C# Xamarin Android OnOptionItemSelected异步
我是Xamarin和Android开发的新手(来自Web MVC背景),所以我只是尝试一些东西来学习它。无论如何,我也在努力改进C#中的异步任务特性,我似乎对它有一个问题 我有一个刷新菜单项,单击该菜单项将调用天气API以获取最新信息,然后我想用该数据更新ListView。我可以毫无问题地出去获取最新的数据,解析数据,并为列表项创建数组。问题是,无论我如何尝试更新适配器或列表视图,都不会发生任何事情。在调试和单步执行之后,似乎只要它点击适配器的Clear方法,它就会停止调试并继续运行应用程序(没有错误消息或我能看到的任何东西) 以下是我的代码:C# Xamarin Android OnOptionItemSelected异步,c#,listview,asynchronous,xamarin,C#,Listview,Asynchronous,Xamarin,我是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));
}
public异步任务SetForecastInfo()
{
var task=new FetchWeatherTask();
var data=wait task.ExecuteAsync();
字符串[]新数据=新字符串[7];
对于(变量i=0;i<7;i++)
{
//我在这里为列表创建新字符串
}
_listItems=新数据;
_forecastAdapter.Clear();
_AddAll(新列表(_listItems));
}
我在_forecastAdapter.Clear()上设置了一个断点,并检查了所有变量,所有变量看起来都很完美,并且都有它需要的所有数据。虽然如果我将鼠标悬停在Clear()上,Visual Studio调试器会显示“未知成员:Clear”,然后按F10键转到下一个AddAll调用,当我这样做时,它会继续执行,因此AddAll方法永远不会被调用。也不会将错误消息打印到日志中
这是因为我无法在OnOptions ItemSelected中等待SetForecastino吗?我是不是完全错了(很可能,只是想学习)?感谢您的帮助
PS:U ForecasAdapter在应用程序首次加载时工作正常。它现在只是被设置为静态数据,只是试图在刷新时更新它以测试一些东西。我最终解决了这个问题,摆脱了所有的异步内容,只是尝试用静态数据重新填充它。这样做给了我
Java.Lang.UnsupportedOperationException.
在研究了为什么会在ArrayAdapter上引发该异常后,我找到了答案
我最初用一个普通的静态数组创建了ArrayAdapter。当它试图运行clear方法时,由于这个原因,它无法删除这些项。当我第一次初始化ArrayAdapter
时,切换到使用允许动态删除和添加元素的集合(如列表
)修复了此问题。肯定是我本来应该抓到的东西。我试着运行你的代码(刚刚创建了一个简单的空android应用程序),它运行得很好。看起来像是一些非常奇怪的mono运行时问题(这些问题有时发生在xamarin…)。你能为你的应用程序提供一个可编译和可运行的样本以供进一步测试吗?@kaibrumummed是的,我能。我现在就准备好。我还删除了所有异步任务,所以当我调用setForecastino时,它只会将其设置为不同的静态数据。当像这样运行它时,我现在会在调用clear时立即抛出一个异常。日志中出现错误:“[Error]致命的未处理异常:Java.Lang.UnsupportedOperationException:引发了类型为'Java.Lang.UnsupportedOperationException'的异常。”@kaibrumummed我在最终得到该异常后立即解决了该问题,因为这最终为我研究该问题提供了一些见解。我会发布我的答案来回答我自己的问题,希望能帮助其他人。