2016-08-17 36 views
2

我使用AsyncTask從我創建的Web服務獲取數據。現在我想向用戶顯示正確的錯誤消息,就像互聯網不可用一樣,如果服務器關閉,它將顯示敬酒,同樣會顯示敬酒。我想在doInBackground()中設置一個錯誤類似「服務器關閉」或「網絡問題發生」的字符串,並在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 
      } 
     } 
    } 
} 

這只是一個考試PLE。你可以在ApiResponse中放入任何你想要的東西,並組成這些數據的模型。 (如從api獲得的狀態碼,由某些轉換器生成的json響應pojo類等)。一旦數據有界,您可以在onPostExecute()中使用它,因爲它將始終在您的UI線程上運行。請注意,AsyncTask的第三個類型參數Result是按照定義構建的: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一個例子,但你可以看到如何解決這個問題。

相關問題