检查AsyncTask是否耗时太长

时间:2010-10-01 08:08:28

标签: android

我有一个从网上获取信息的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;
            }

提前致谢并告诉我您是否需要更多信息!

2 个答案:

答案 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本身内处理超时。