2016-08-17 2 views
2

내가 만든 웹 서비스의 데이터 형식을 얻으려면 AsyncTask을 사용하고 있습니다. 이제는 인터넷에 접속할 수 없다면 사용자에게 적절한 오류 메시지를 표시하고 싶습니다. 서버가 다운되면 토스트가 표시됩니다. doInBackground()에서 "server is down"또는 "internet problem occured"와 같은 오류가있는 문자열을 설정하고 onPostExecute()에서 토스트를 표시하려고하지만 내 서버가 다운 된 경우 어떤 예외가 발생했는지 알고 싶습니다. 내 서버가 활성화되었지만 전송 중에 인터넷 연결이 끊어지면 어떤 예외가 발생합니까?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 클래스 생성). 바운드 된 데이터를 얻은 후에는 항상 UI 스레드에서 실행되므로 onPostExecute()에서 사용할 수 있습니다. 세 번째 유형 매개 변수 ResultAsyncTask 인 것은 정의에 따라 구성됩니다. AsyncTask<Params, Progress, Result>. 당신의 doInBackground() 문자열과 이상의

0

캐치 예외는, 당신은 당신이 onPostExecute() 방법에서 토스트 메시지를 표시 할 수 있습니다,이 같은 필요한 따라 달라집니다 :이 예 YUST이다, 물론

@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(); 
     } 
} 

을하지만, 어떻게 효과가 있는지 알 수 있습니다.

관련 문제