我有一个从网上获取信息的AsyncTask。有时连接失败,AsyncTask processdialog永远运行。
在doInBackground中,如果我的捕获信息为空,我最后检查一下,如果是这种情况,它应该显示为“正按钮/否定”按钮,但这不会发生。对话框刚刚运行。
如何检查AsyncTask是否花费太长时间(可能是5秒)并关闭对话框?
代码段(doInBackground):
//orders is my ArrayList<Order> object, from my own Order class.
if(orders==null) {
pdia.dismiss();
AlertDialog.Builder alt_bld = new AlertDialog.Builder(ctx);
alt_bld.setMessage("Try agin?")
.setCancelable(false)
.setPositiveButton("Try again", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
button_refresh.setVisibility(View.GONE);
new ListTask().execute(null, null , null);
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = alt_bld.create();
alert.setTitle("Connection failed!");
alert.show();
}
else {
return orders;
}
提前致谢并告诉我您是否需要更多信息!
答案 0 :(得分:2)
您可以从doInBackground()
中获取该流程的值,而不是在onPostExecute()
中检查您的结果,如下所示:
protected void onPostExecute(ArrayList<Order> localOrders){
super.onPostExecute(localOrders);
if (localOrders==null) {
// Paste the positive and negative DialogListeners here
// and dismiss the dialog.
}
}
doInBackground()
进程中的结果会传递到onPostExecute
的参数,因此您可以检查您的ArrayList对象是否为空。
答案 1 :(得分:2)
但是在onPostExecute中编写上面的代码片段会破坏目的吗?我们希望用户不要等待5秒钟从webservice获得答案,因此我们必须在doInBackground本身内处理超时。