Async-http经常挂起。

时间:2014-05-19 10:53:51

标签: android android-async-http loopj

当我启动异步请求时,我启动ProgressDialog,并且在看似随机的情况下,对话不会被忽略(代码不会触发onSuccess或onFailure)。我处理来自服务器的两个可能的成功响应(其中一个是错误)并且我有一个失败块,所以理论上ProgressDialog应该总是解雇。有人能说出我错过了什么事吗?还是有更好的结构?

我的代码结构:

  1. 我有一个处理所有网络的网关类
  2. 调用调用处理对话框的.show()和.dismiss()事件
  3. 网关:

    public static void post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
        client.post(getAbsoluteUrl(url), params, responseHandler);
    }
    
    public static void loadItems(final ItemAdapter itemAdapter, int itemID) {
    
        final String url = String.format(Constants.URL_ITEMS, itemID);
    
        post(url, null, new JsonHttpResponseHandler() {
    
            @Override
            public void onSuccess(JSONObject response) {
    
                try {
                    if (!response.isNull("items")) {
    
                        itemAdapter.updateData(items);
    
                    } else if (!response.isNull("error")) {
    
                       itemAdapter.signalError(response.getString("error"));
    
                    }
    
                } catch (JSONException e) {
                    itemAdapter.signalError("An unknown error has occurred");
                    e.printStackTrace();
                }
    
    
            }
            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error)
            {
                if (error instanceof SocketTimeoutException || error instanceof ConnectTimeoutException) {
                    itemAdapter.signalError("Connection timeout! Please check that you are connected to the internet");
                } else {
                    itemAdapter.signalError("An unknown error has occurred");
                }
            }
    
        });
    
    }
    

    适配器:

    public ItemAdapter(Context context, int itemID) {
    
        progressDialog = ProgressDialog.show(context, "Items",
                "Loading items", true);
        Gateway.loadItems(this, itemID);
    
    
    }
    
    public void updateData(ArrayList<Items> items) {
        progressDialog.dismiss();
        this.items = items;
        notifyDataSetChanged();
    }
    
    public void signalError(String errorMessage) {
    
        progressDialog.dismiss();
    
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setTitle("Error")
                .setMessage(errorMessage)
                .setNegativeButton("OK", null).show();
    
    }
    

4 个答案:

答案 0 :(得分:2)

我不知道你的代码在做什么,但你的if语句看起来很可疑。

if (!response.isNull("items")) {
  itemAdapter.updateData(items);
} else if (!response.isNull("error")) {
 itemAdapter.signalError(response.getString("error"));
}

可能是这两个条件都没有满足吗?如果是这样,对话框将不会被解除。您只有在例外情况下或在满足上述条件之一时才会将其解雇。

答案 1 :(得分:0)

我在某处读到图书馆存在设计缺陷,人们在同一问题上遇到了一些问题。

但最可靠的解决方案是覆盖onSuccess中的所有onFailureJsonHttpResponseHandler方法。通过这种方式,您可以确保正在进行通信。

希望这有帮助

答案 2 :(得分:0)

处理其他情况也就像

这样的成功方法

@覆盖         public void onSuccess(JSONObject响应){

        try {
            if (!response.isNull("items")) {

                itemAdapter.updateData(items);

            } else if (!response.isNull("error")) {

               itemAdapter.signalError(response.getString("error"));

            } else {
               // Code to dismiss the dialog
            }

        } catch (JSONException e) {
            itemAdapter.signalError("An unknown error has occurred");
            e.printStackTrace();
        }


    }

答案 3 :(得分:-1)

如果你主要担心的是关闭ProgressDialog ..那就试试吧。

try{

 runOnUiThread(new Runnable() {
                    public void run() {
                                   progressDialog.dismiss();
                    }
                   });

}catch(Exception beauty)
{
// Log error if any .. 
}

希望它有所帮助!