2016-08-17 13 views
2

私はAsyncTaskを使用して、作成したWebサービスのデータ形式を取得しています。今私は、インターネットが利用できない場合と同様に、サーバーがダウンしている場合は、それのためにトーストを表示するためのトーストを表示しますように、ユーザーに適切なエラーメッセージを表示したい。 doInBackground()で "server is down"や "internet problem occured"のようなエラーの文字列を設定し、onPostExecute()でToastを表示したいのですが、私のサーバがダウンしていれば何の例外がスローされているか知りたいですか?私のサーバがアクティブであるが転送中にインターネットが切断された場合、どのような例外がスローされますか?AndroidでAsyncTaskのエラーメッセージをユーザーに表示するにはどうすればいいですか?

+0

はい、もちろん、これらの例外をすべてキャッチする必要があります。 – greenapps

+0

doInBackground()ではToast()を使用できません。 onPostExecute()でそれを行います。 – greenapps

+0

はい私はdoInBackground()に文字列エラーを設定し、onPostExecute()でトーストを表示することを知っていますが、私のサーバーがダウンしている場合には何の例外がスローされるかを知りたいですか?私のサーバがアクティブであるが転送中にインターネットが切断された場合、どのような例外がスローされますか? –

答えて

0

おそらく応答をモデリングするのが最も簡単で簡単な方法です。その後

class ApiResponse { 
      public final String responseString; 
      public final Throwable error; 

     public ApiResponse (String responseString,Throwable error){ 
      this.responseString = responseString; 
      this.error = error; 
     } 
    } 

、あなたがそのモデルへの応答やエラーを結合して、doInBackground();

から返すことができます:あなたは、データからモデルを作成することができ

例えば

は、次のようなです擬似コード:

class ApiAsyncTask extends AsyncTask<Void, Void, ApiResponse> { 
    .... 

    protected ApiResponse doInBackground() { 

     try { 
      //callApi and get response, if success pass null in error 
      return new ApiResponse(responseString, null) 
     } catch (Exception e) { 
      e.printStackTrace(); 
      //otherwise pass that error 
      return new ApiResponse(null, e); 
     } 
    } 

    protected void onPostExecute(ApiResponse apiResponse) { 
     //now just need to check if error is null 
     if (error == null) { 
      String json = apiResponse.responseString; 
      //parse response 
     } else { 
      //get error and check with instanceOf 
      Throwable error = apiResponse.error; 
      if (error instanceOf SocketTimeoutException){ 
       //show timeout error 
      } 
      else if (error instanceOf SomeXYZException){ 
       //handle that exception 
      } 
     } 
    } 
} 

これは単なる試験ですプレ希望するものをApiResponseに入れ、そのデータのモデルを作成することができます。 (ステータスコードはapiから取得し、何らかのコンバータなどによってjson応答のpojoクラスを生成したものなど)。データをバインドしたら、onPostExecute()で使用できます。これは、常にUIスレッドで実行されるためです。第3のタイプのパラメータResultAsyncTaskであることは、定義のために、AsyncTask<Params, Progress, Result>のために構築されていることに注意してください。

0

あなたdoInBackground()文字列へとよりのキャッチ例外は、あなたが必要なものによって異なり、あなたは、onPostExecute()方法から、このような何かトーストメッセージを表示することができます。もちろん

@Override 
protected Void doInBackground(Void... arg0) { 

try { 
      // do you stuff here 


     } catch (UnknownHostException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      response = "UnknownHostException: " + e.toString(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      response = "IOException: " + e.toString(); 
     } finally { 
      ... 

       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 

@Override 
protected void onPostExecute(Void result) { 
     if (response.contains("IOException: java.net.ConnectException:")) { 
      Toast.makeText(getApplicationContext(), "YOUR TEXT HERE", Toast.LENGTH_SHORT).show(); 
      mProgressDialog.dismiss(); 
     } 
     else if (response.contains("IOException: java.net.SocketTimeoutException:")) { 
      Toast.makeText(getApplicationContext(), "YOUR TEXT HERE", Toast.LENGTH_SHORT).show(); 
      mProgressDialog.dismiss(); 
     } 
     else if (response.contains("IOException: java.net.SocketException:")) { 
      Toast.makeText(getApplicationContext(), "YOUR TEXT HERE", Toast.LENGTH_SHORT).show(); 
      mProgressDialog.dismiss(); 
     } 
} 

を、これは一例yustですが、それがどのように働くか見ることができます。

関連する問題