2017-08-13 6 views
0

私は基本的なアンドロイドアプリを作ろうとしていますが、WebExceptionをキャッチできません。私が接続しようとしているサーバーがオンになっていると、すべて正常に動作しますが、サーバーをオフにすると、私のアンドロイドアプリケーションがハングアップします。 Windowsフォームアプリケーションでコードを試してみましたが、動作していましたが、例外は捕捉されていますが、Xamarinではハングします。私を助けてください。 HttpClientを使用して - 私はお勧めしたいxamarinでWebExceptionがキャッチされないandroid

MainActivity.cs

protected override void OnCreate(Bundle bundle) 
{ 
    base.OnCreate(bundle); 

    // Set our view from the "main" layout resource 
    SetContentView (Resource.Layout.Main); 

    Button btn1 = FindViewById<Button>(Resource.Id.button1); 

    btn1.Click += (object sender, EventArgs e) => 
    { 
     var result = Remote.Connect(); 
     if(result == WebStatus.Authenticated) 
     { 
      Toast.MakeText(this, "Works!", ToastLength.Short).Show(); 
     } 
     else if(result == WebStatus.Unauthorized) 
     { 
      Toast.MakeText(this, "Unauthorized", ToastLength.Short).Show(); 
     } 
     else 
     { 
      Toast.MakeText(this, "Something went wrong!", ToastLength.Short).Show(); 
     } 
    }; 
} 

リモートクラス

public static WebStatus Connect() 
{ 
    // some code 

    WebRequest request = WebRequest.Create(url); 

    try 
    { 
     using (WebResponse response = request.GetResponse()) 
     { 
      return WebStatus.Authenticated; 
     } 
    } 
    catch(WebException e) 
    { 
     using (WebResponse response = e.Response) 
     { 
      WebStatus status = new WebStatus(); 
      HttpWebResponse httpResponse = (HttpWebResponse)response; 
      if (httpResponse != null) 
      { 
       switch (httpResponse.StatusCode) 
       { 
        case HttpStatusCode.Unauthorized: 
         status = WebStatus.Unauthorized; 
         break; 
        case HttpStatusCode.NotFound: 
         status = WebStatus.Error; 
         break; 
        default: 
         status = WebStatus.Error; 
         break; 
       } 
      } 

      return status; 
     } 
    } 
} 

答えて

0

あなたはXamarinは、物事のやり方をお勧めします。これはForms開発でこれまで使用していたものではないかもしれませんが、これはより高度なAPIであり、これを行うことはできますが、余分なコードを書く必要はありません。

Xamarin Universityは、modernhttpclient nugetパッケージを使用して、以下のようにAndroidコードを実装するように教えています。 Nugetパッケージは、プラットフォーム(この場合はアンドロイド)に自動的に最適化されたライブラリを使用してWeb呼び出しを実行させます。

サンプルコードAPIからいくつかのものを得るために、エラー処理、およびリモートオブジェクトの直列化復元:

var httpClient = new HttpClient(new NativeMessageHandler()); 
httpClient.DefaultRequestHeaders.Add("Accept", "application/json"); 
var responseMessage = await httpClient.GetAsync("some/api/endpoint/here"); 
if (!responseMessage.IsSuccessStatusCode) 
{ 
    if (responseMessage.IsUnauthorized()) { // some handling here } 
} 
// time to get the result 
var res = await responseMessage.Content.ReadAsStringAsync(); 
var obj = JsonConvert.DeserializeObject<Object>(res); 

注:Microsoft.AspNet.WebApi.Client nugetパッケージが必要になります。

+0

例外はありませんが、サーバーがオフラインの場合はこれが機能します。それ以外の場合は、アプリケーションがクラッシュしました – paulharley421

+0

上記のコードを非同期ブロックで呼び出すことはできますか? "GetAsync"の周りの試行がエラーを捕らえるはずです - 私はバニラアンドロイドアプリケーションでこれを再現しました。また、Microsoft.AspNet.WebApi.Clientのnugetパッケージがインストールされていることを確認してください。 –

関連する問題