3

非同期リクエストを開始するときに ProgressDialog を開始すると、一見ランダムな場合にダイアログが閉じられません (コードは onSuccess または onFailure を起動しません)。サーバーからの可能な成功応答 (そのうちの 1 つはエラー) の両方を処理し、失敗ブロックがあるため、理論的には 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();

}
4

4 に答える 4

2

あなたのコードが何をしているのかわかりませんが、if ステートメントは疑わしいようです。

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

2 つの条件のいずれも満たされていない可能性がありますか? その場合、ダイアログは閉じられません。例外の場合、または上記の条件のいずれかが満たされた場合にのみ却下します。

于 2014-05-26T16:42:52.850 に答える
0

else ケースも 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 に答える
0

ライブラリに設計上の欠陥があり、人々が同じ問題でいくつかの問題を抱えていることをどこかで読みました。

しかし、最も信頼できる解決策は、 内のすべてのonSuccessおよびonFailureメソッドをオーバーライドすることでしたJsonHttpResponseHandler。そうすることで、確実にコミュニケーションがとれるようになります。

お役に立てれば

于 2014-05-21T12:52:37.240 に答える