3

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

我的代码结构:

  1. 我有一个处理所有网络的网关类
  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();

}
4

4 回答 4

2

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

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

难道这两个条件都不满足?如果是这样,对话框将不会被关闭。只有在例外情况下或满足上述条件之一时,您才会将其关闭。

于 2014-05-26T16:42:52.850 回答
0

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

但最可靠的解决方案onSuccessonFailure覆盖JsonHttpResponseHandler. 通过这种方式,您可以确定通信正在进行。

希望这可以帮助

于 2014-05-21T12:52:37.240 回答
0

处理其他情况也可以使用 onSuccess 方法,例如

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


    }
于 2014-05-28T07:47:45.253 回答
-1

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

try{

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

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

希望能帮助到你!

于 2014-05-22T11:32:18.443 回答