Async-http经常挂起



当我启动异步请求时,我启动了一个ProgressDialog,并且在看似随机的场合,对话框不会解散(代码不会触发onSuccess或onFailure)。我处理来自服务器的两个可能的成功响应(其中一个是错误),并且我有一个失败块,因此理论上ProgressDialog应该总是解散。有人能告诉我我错过了什么活动吗?还是有更好的结构?

我的代码结构:
  1. 我有一个Gateway类来处理所有的网络
  2. 调用处理对话框的。show()和。dismiss()事件
网关:

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

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

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

可能两个条件都不满足吗?如果是,对话框将不会被取消。只有在出现异常或满足上述条件之一时才将其取消。

我在某处读到库中有一个设计缺陷,人们遇到了一些同样的问题。

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

希望能有所帮助

处理else情况,也处理onSuccess方法,如

@Overridepublic void onSuccess(JSONObject response) {

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

    }

如果您主要关注的只是关闭ProgressDialog ..然后像这样试试。

try{
 runOnUiThread(new Runnable() {
                    public void run() {
                                   progressDialog.dismiss();
                    }
                   });
}catch(Exception beauty)
{
// Log error if any .. 
}

希望有帮助!

相关内容

  • 没有找到相关文章

最新更新