2011-11-03 83 views
0

我創建一個使用異步任務登錄和發送數據的Android應用(HTTP POST請求,該應用程序正常工作時的網絡連接是好的,但登錄時以及張貼由於緩慢的數據時間過長連接的應用程序的力量關閉,我想顯示一個吐司「連接錯誤,當發生這種情況。請幫助異步任務的網絡錯誤

+0

我建議你到Android代碼添加到您的問題 – morphium

回答

0

您的應用程序可能崩潰,因爲你試圖顯示吐司不在UI線程。應通過使用Handler或onPostExecute()方法對UI進行任何更改,該方法也在UI線程中運行

如何在doInBackground的線程中捕獲異常d,並代表他們在UI線程是另外一個問題,我可以建議你這樣的解決方案:

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; 
         } 

       } 
    } 
} 

通過這種方式,可以靈活控制網絡錯誤,並採取適當的行動,根據這些錯誤。