【问题标题】:Async-http often hangs.Async-http 经常挂起。
【发布时间】:2014-05-19 10:53:50
【问题描述】:

我在启动异步请求时启动 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();

}

【问题讨论】:

  • 添加一条日志消息,每次调用 onFailure 时都会向您报告。
  • 我做到了。在某些情况下,既不称为失败,也不称为成功。
  • 哥们也请添加你的网关类..
  • 第一段代码是网关类的相关部分。它托管所有服务器请求,因此它相当长。
  • 你用的是什么http库?

标签: android android-async-http loopj


【解决方案1】:

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

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

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

【讨论】:

  • 它在 JSON 中寻找键“items”或“error”。这是仅有的两个选项。
  • 这可能是仅有的两个有效选项,但如果您的服务器以某种意外方式出现故障,则响应可能包含这两个值以外的其他值。
【解决方案2】:

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

但最可靠的解决方案是覆盖JsonHttpResponseHandler 中的所有onSuccessonFailure 方法。这样您就可以确定通信正在进行。

希望对你有帮助

【讨论】:

  • 是的,我为我的每个帖子都这样做。我添加了每个登录以检查它们是否被调用。问题是在随机实例上都没有被调用。
  • 在您的代码中,您不会覆盖所有 onSuccess 和所有 onFailure 方法。每个都有不止一个。 loopj.com/android-async-http/doc/com/loopj/android/http/…
  • 这是有道理的。我会调查的。
  • 两天的测试。在 18% 的情况下(编写了一个循环来发送数千个请求)它没有成功和失败。这真让我抓狂。我想我会改变框架。
  • BTW .. 前段时间我的代码有问题,它从服务器请求 json 字符串。在某些情况下,我永远不会得到回应。我终于决定更换服务器,现在一切正常。
【解决方案3】:

处理其他情况也像 onSuccess 方法

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


    }

【讨论】:

  • 整个方法没有触发。 if/then 块没有问题。
【解决方案4】:

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

try{

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

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

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2021-06-28
    • 2011-07-29
    相关资源
    最近更新 更多