2011-11-03 85 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; 
         } 

       } 
    } 
} 

通过这种方式,可以灵活控制网络错误,并采取适当的行动,根据这些错误。