我是Xamarin和Android開發的新手(來自Web MVC背景),所以我只是想了解一些東西。無論如何,我也試圖在C#中的異步任務功能更好,我似乎有一個問題。Xamarin Android OnOptionsItemSelected async
我有一個刷新菜單項,點擊後會調用天氣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 Debugger會說「未知成員:清除」,然後按F10跳到下一個AddAll調用,當我這樣做時,它只是繼續執行,所以AddAll方法永遠不會被調用。沒有錯誤信息被輸出到日誌中。
這是因爲我無法在OnOptionsItemSelected內部等待SetForecastInfo?我是否完全錯誤(可能只是試圖學習)?任何幫助表示讚賞!
PS:當應用第一次加載時,_forecastAdapter可以完美工作。它現在只是設置爲靜態數據,只是試圖讓它在刷新時更新以測試一些事情。
我試着運行你的代碼(只是創建了一個簡單的空android應用程序),它運行得很好。看起來像一些超級奇怪的單聲道運行時問題(這些有時與xamarin發生...)。你能提供一個可編譯和可運行的應用程序樣本來進一步測試嗎? –
@KaiBrummund是的,我可以。我現在就準備好了。我也去除了所有的異步任務,所以當我調用SetForecastInfo時,它會將它設置爲不同的靜態數據。當像這樣運行它時,我現在會在它調用清除時立即拋出異常。錯誤在日誌中:「[錯誤]致命不協調異常:Java.Lang.UnsupportedOperationException:拋出類型'Java.Lang.UnsupportedOperationException'的異常。」 – twigman08
@KaiBrummund在我最終得到這個例外之後,我終於解決了這個問題,因爲這最終讓我對這個問題有了一些瞭解,以供我研究。我會發布我的答案來回答我自己的問題,希望能夠幫助其他人。 – twigman08