2017-06-08 85 views
0

我創建了一個連接到API以使用httpclient檢索所需數據的類。該文件在視圖文件的代碼中被調用並且完美地工作。比我決定實施MVVM方法。因此,我將用於初始化其他服務類的代碼移到了視圖模型中。 這樣做後,我停止獲取數據。爲了進行調查,我說明了調試會話的斷點放置在我初始化其餘服務類的那一行。比我執行那條線。通過這樣做,我發現一個巨大的Android單聲道異常被拋出,調試會話被停止。該應用程序退出調試會話。 這是自從我在Xamarin Forms中開發我的應用程序以來第一次發生。我不知道它爲什麼會這樣突破。對你的幫助表示感謝。Xamarin Forms - 從pcl的viewmodel調用rest服務

這是正常工作的代碼。 在視圖代碼隱藏文件

[XamlCompilation(XamlCompilationOptions.Compile)] 
public partial class SubtaskPage : ContentPage 
{ 
    protected override void OnAppearing() 
    { 
     base.OnAppearing(); 
     PopulateSubtaskData(); 
    } 
    private async void PopulateSubtaskData() 
    { 
     lstSubtasks.IsRefreshing = true; 
     try 
     { 
      RestService rs = new RestService(); 
      SResponse = await rs.GetSubtasksAsync(Convert.ToInt32(Application.Current.Properties["UserId"])); 
      if (SResponse.Status == 1) 
      { 
       lstSubtasks.ItemsSource = SResponse.Subtasks; 
      } 
      else 
      { 
       await DisplayAlert("Error", SResponse.Message, "Ok"); 
      } 
     } 
     catch (Exception E) 
     { 
      Debug.WriteLine(@"GetSubtasksAsync -> ERROR {0}", E.Message); 
     } 
     lstSubtasks.IsRefreshing = false; 
    } 
} 

REST服務類如下: 這個類是在一個名爲「服務」一個單獨的文件夾。由於安全原因,ip和url已被更改。

class RestService 
{ 
     HttpClient client; 
     public List<Ticket> Tickets { get; private set; } 
     string Server1 = "server ip"; 
     string Server2 = "server ip"; 
     public RestService() 
     { 
      client = new HttpClient(); 
      client.MaxResponseContentBufferSize = 256000; 
     } 
     public async Task<SubtasksResponse> GetSubtasksAsync(int UserId) 
     { 
      SubtasksResponse SubtaskResponse = new SubtasksResponse(); 
      string ApiUrl = "URL"; 
      string Url = ""; 
      HttpResponseMessage response; 
      if (CrossConnectivity.Current.IsConnected) 
      { 
       Url = await GetActiveServerAsync(); 
       if (Url != "") 
       { 
        var uri = string.Format(Url + ApiUrl, UserId); 
        try 
        { 
         response = await client.GetAsync(uri); 
         if (response.IsSuccessStatusCode) 
         { 
          var content = await response.Content.ReadAsStringAsync(); 
          SubtaskResponse.Subtasks = JsonConvert.DeserializeObject<List<Ticket>>(content); 
          SubtaskResponse.Status = 1; 
         } 
         else 
         { 
          SubtaskResponse.Subtasks = null; 
          SubtaskResponse.Status = 0; 
          SubtaskResponse.Message = "Attempt to fetch data from server was unsuccessful. Please try again"; 
         } 
        } 
        catch (Exception E) 
        { 
         SubtaskResponse.Subtasks = null; 
         SubtaskResponse.Status = 0; 
         SubtaskResponse.Message = "Error occured while fetching data from the server. Please try again"; 
        } 
       } 
       else 
       { 
        SubtaskResponse.Subtasks = null; 
        SubtaskResponse.Status = 0; 
        SubtaskResponse.Message = "Remote Server Not Responding! Please try again later"; 
       } 
      } 
      else 
      { 
       SubtaskResponse.Subtasks = null; 
       SubtaskResponse.Status = 0; 
       SubtaskResponse.Message = "No Network Connection Found! Please connect to a network and try again"; 
      } 
      return SubtaskResponse; 
     } 
    } 
} 

這工作正常,直到我將視圖模型添加到組合中。 這就是我在視圖模型中調用函數的方式。

async Task<SubtasksResponse> PopulateSubtaskList() 
{ 
    RestService rs = new RestService(); 
    IsBusy = true; 
    _subtaskList = await rs.GetSubtasksAsync(Convert.ToInt32(Application.Current.Properties["UserId"])); 
    IsBusy = false; 
    return _subtaskList; 
} 

「RestService rs = new RestService();」這是代碼中斷的地方。

下面是代碼中斷時發生的異常的圖像。 enter image description here

希望你能清楚瞭解情況。請讓我知道是否需要額外的信息。 謝謝

+0

如果您可以共享代碼,無論您嘗試到現在爲止,這將是非常好的。這樣社區可以更好地幫助你。 – Yogesh

+3

需要將生成異常的代碼和異常本身添加到您的問題 – SushiHangover

+0

請參閱:https://developer.xamarin.com/guides/xamarin-forms/xaml/xaml-basics/data_bindings_to_mvvm/ – Pratik

回答

0

在此頁面找到了答案(https://releases.xamarin.com/common-issues-in-the-xamarin-15-2-2-release-being-tracked-by-the-xamarin-team/)。

的解決方案如下

  1. 下載缺少的Mono.Posix文件並解壓縮檔案。
  2. 右鍵單擊資源管理器中的Mono.Posix.dll文件,然後選擇屬性。
  3. 選中「數字簽名」選項卡以確保文件顯示有效的Xamarin Inc.簽名。
  4. 在「常規」選項卡的底部,如果顯示「取消阻止」複選框,啓用它並選擇「確定」。 (此複選框取決於文件的下載方式。)
  5. 對於Visual Studio 2017,將Mono.Posix.dll文件複製到「Xamarin.VisualStudio」擴展目錄中。例如,對於企業版的默認安裝,將該文件複製到: C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ Enterprise \ Common7 \ IDE \ Extensions \ Xamarin.VisualStudio
  6. 對於Visual Studio請將文件複製到「Xamarin \ Xamarin」擴展目錄中: C:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ Common7 \ IDE \ Extensions \ Xamarin \ Xamarin \
  7. 退出並重新啓動Visual Studio。

欲瞭解更多詳情,請訪問上面給出的鏈接。

0

不要這樣做。如果你想從mvvm Xamarin Forms應用程序中調用休息,我可以建議Refit。所有困難的工作已經爲你完成並抽象化了。用幾行代碼即可啓動並運行。

+0

我正在使用的API是用PHP編寫的。 –

+0

只要它是一個可以使用的休息服務,它與你正在調用的api是無關緊要的 – Moorlang

0

順便提一下,您顯示的錯誤信息可能與您的代碼無關,但是是最近Xamarin版本中的錯誤。見這裏:https://bugzilla.xamarin.com/show_bug.cgi?id=56787

+0

這個問題在xamarin表單中仍然沒有修復 –

+0

這個問題是通過在這[鏈接](https://releases.xamarin.com/common-issues-in-the-xamarin-15-2-2-release-being-tracked-by-the-xamarin-team/)。這是在上面給出的bugzilla鏈接中提到的。 –