Android 异步任务网络错误

Android 异步任务网络错误,android,android-asynctask,Android,Android Asynctask,我正在创建一个android应用程序,该应用程序使用异步任务登录和发送数据(HTTP Post请求)。当互联网连接良好时,该应用程序工作正常,但当进行日志记录时,由于连接缓慢,需要花费太长时间发布数据,应用程序组将关闭。我想显示一个toast“连接错误”出现这种情况时,请帮助您的应用程序可能会崩溃,因为您试图在UI线程中不显示Toast。也就是说,您应该始终使用onPostExecute()方法或在onPostExecute()方法中对UI进行任何更改,onPostExecute()方法也会在U

我正在创建一个android应用程序,该应用程序使用异步任务登录和发送数据(HTTP Post请求)。当互联网连接良好时,该应用程序工作正常,但当进行日志记录时,由于连接缓慢,需要花费太长时间发布数据,应用程序组将关闭。我想显示一个toast“连接错误”出现这种情况时,请帮助

您的应用程序可能会崩溃,因为您试图在UI线程中不显示Toast。也就是说,您应该始终使用onPostExecute()方法或在onPostExecute()方法中对UI进行任何更改,onPostExecute()方法也会在UI线程中运行

如何在doInBackground的线程中捕获异常并在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;
                       }

                }
    }
}
私有类登录任务扩展
异步任务{
专用静态final int NETWORK_NO_ERROR=-1;
专用静态最终int网络\u主机\u不可访问=1;
专用静态最终int网络\u无\u访问\u互联网=2;
专用静态最终int网络超时=3;
//您可以继续此列表。。。
整型服务器错误=网络无错误;
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
progressDialog.show();//之前不要忘记创建它
}
@凌驾
受保护的JSONArray[]doInBackground(无效…v){
JSONArray[]结果=null;
试一试{
结果=NetworkManager.login(/*您需要的所有参数*/);
}捕获(JSONException e){
返回null;
}捕获(连接异常){
serverError=网络\u无\u访问\u互联网;
返回null;
}捕获(未知后异常e){
serverError=网络\主机\无法访问;
返回null;
}捕获(SocketTimeoutException e){
serverError=网络超时;
返回null;
}捕获(URISyntaxException e){
// ..
返回null;
}捕获(客户端协议例外e){
// ..
返回null;
}捕获(例外e){
// ..
返回null;
}
返回结果;
}
@凌驾
受保护的void onPostExecute(JSONArray[]结果){
progressDialog.disclose();
如果(结果!=null){
processAndShowResult(结果);
}否则{
交换机(服务器错误){
案例网络无错误:
Toast.makeText(YourActivity.this,“可能来自服务器的响应无效”,Toast.LENGTH_LONG.show();
打破
案例网络\u无\u访问\u互联网:
//您可以为不同类型的错误自定义错误消息(或行为)
案例网络超时:
案例网络\主机\无法访问:
Toast.makeText(YourActivity.this,“连接错误”,Toast.LENGTH_LONG.show();
打破
}
}
}
}

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

我建议您在问题中添加android标签