2016-01-20 63 views
0

我是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可以完美工作。它現在只是設置爲靜態數據,只是試圖讓它在刷新時更新以測試一些事情。

+1

我試着運行你的代碼(只是創建了一個簡單的空android應用程序),它運行得很好。看起來像一些超級奇怪的單聲道運行時問題(這些有時與xamarin發生...)。你能提供一個可編譯和可運行的應用程序樣本來進一步測試嗎? –

+0

@KaiBrummund是的,我可以。我現在就準備好了。我也去除了所有的異步任務,所以當我調用SetForecastInfo時,它會將它設置爲不同的靜態數據。當像這樣運行它時,我現在會在它調用清除時立即拋出異常。錯誤在日誌中:「[錯誤]致命不協調異常:Java.Lang.UnsupportedOperationException:拋出類型'Java.Lang.UnsupportedOperationException'的異常。」 – twigman08

+0

@KaiBrummund在我最終得到這個例外之後,我終於解決了這個問題,因爲這最終讓我對這個問題有了一些瞭解,以供我研究。我會發布我的答案來回答我自己的問題,希望能夠幫助其他人。 – twigman08

回答

0

我最終解決了這個問題,通過擺脫所有異步的東西,只是試圖用靜態數據重新填充它。這樣做給了我Java.Lang.UnsupportedOperationException.在做了一些研究,爲什麼這個異常會在ArrayAdapter上拋出,我找到了我的答案。

我最初創建了一個普通的靜態數組ArrayAdapter。當它試圖運行清除方法時,它不能刪除這些項目。切換到使用允許動態刪除和添加元素的集合(如List<string>)當我第一次初始化ArrayAdapter時解決了這個問題。絕對是我原本應該抓到的東西。