2011-11-03 3 views
0

비동기 작업을 사용하여 데이터를 보내고 데이터를 보내는 안드로이드 응용 프로그램을 만들고 있습니다 (HTTP 포스트 요청. 인터넷 연결이 좋지만 로깅 할 때 응용 프로그램이 제대로 작동하고 느린 속도로 인해 데이터를 게시하는 데 너무 오래 걸립니다. 연결이 응용 프로그램 강제 종료됩니다.이 때 발생하는 "연결 오류"축하 표시하고 싶습니다. 도와주세요비동기 작업 네트워크 오류

+0

질문에 안드로이드 태그를 추가하는 것이 좋습니다. – morphium

답변

0

UI 스레드에서 토스트를 표시하려고하기 때문에 응용 프로그램이 다운되는 경우가 있습니다. Handler을 사용하거나 UI 스레드에서 실행되는 onPostExecute() 메서드를 사용하여 UI를 변경해야합니다.

doInBackground의 threa에서 예외를 catch하는 방법 이에 의해,

private class LoginTask extends 
     AsyncTask<Void, Integer, JSONArray[]> { 

    private static final int NETWORK_NO_ERROR = -1; 
    private static final int NETWORK_HOST_UNREACHABLE = 1; 
    private static final int NETWORK_NO_ACCESS_TO_INTERNET = 2; 
    private static final int NETWORK_TIME_OUT = 3; 
      // You can continue this list... 

    Integer serverError = NETWORK_NO_ERROR; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     progressDialog.show(); // Don't forget to create it before 

    } 

    @Override 
    protected JSONArray[] doInBackground(Void... v) { 
     JSONArray[] result = null; 
     try { 
      result = NetworkManager.login(/* All params you need */); 
     } catch (JSONException e) { 
      return null; 
     } catch (ConnectException e) { 
      serverError = NETWORK_NO_ACCESS_TO_INTERNET; 
      return null; 
     } catch (UnknownHostException e) { 
      serverError = NETWORK_HOST_UNREACHABLE; 
      return null; 
     } catch (SocketTimeoutException e) { 
      serverError = NETWORK_TIME_OUT; 
      return null; 
     } catch (URISyntaxException e) { 
      // .. 
      return null; 
     } catch (ClientProtocolException e) { 
      // .. 
      return null; 
     } catch (Exception e) { 
      // .. 
      return null; 
     } 

     return result; 
    } 

    @Override 
    protected void onPostExecute(JSONArray[] result) { 
        progressDialog.dismiss(); 
       if (result != null) { 
        processAndShowResult(result); 
       } else { 
         switch (serverError) { 
          case NETWORK_NO_ERROR: 
        Toast.makeText(YourActivity.this, "Probably, invalid response from server", Toast.LENGTH_LONG).show(); 
           break; 
          case NETWORK_NO_ACCESS_TO_INTERNET: 
           // You can customize error message (or behavior) for different type of error 
          case NETWORK_TIME_OUT: 
          case NETWORK_HOST_UNREACHABLE: 
        Toast.makeText(YourActivity.this, "Error in Connection", Toast.LENGTH_LONG).show(); 
           break; 
         } 

       } 
    } 
} 

당신은 유연하게 이러한 오류에 따라, 네트워크 오류를 제어하고 적절한 조치를 수행 할 수 있습니다 : D와 UI 스레드에서 그들을 대표하는 또 다른 문제는, 나는 당신에게이 솔루션을 제안 할 수 있습니다.