当我启动异步请求时,我启动ProgressDialog,并且在看似随机的情况下,对话不会被忽略(代码不会触发onSuccess或onFailure)。我处理来自服务器的两个可能的成功响应(其中一个是错误)并且我有一个失败块,所以理论上ProgressDialog应该总是解雇。有人能说出我错过了什么事吗?还是有更好的结构?
我的代码结构:
网关:
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();
}
答案 0 :(得分:2)
我不知道你的代码在做什么,但你的if语句看起来很可疑。
if (!response.isNull("items")) {
itemAdapter.updateData(items);
} else if (!response.isNull("error")) {
itemAdapter.signalError(response.getString("error"));
}
可能是这两个条件都没有满足吗?如果是这样,对话框将不会被解除。您只有在例外情况下或在满足上述条件之一时才会将其解雇。
答案 1 :(得分:0)
我在某处读到图书馆存在设计缺陷,人们在同一问题上遇到了一些问题。
但最可靠的解决方案是覆盖onSuccess
中的所有onFailure
和JsonHttpResponseHandler
方法。通过这种方式,您可以确保正在进行通信。
希望这有帮助
答案 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 ..
}
希望它有所帮助!