为什么进度对话框仍然显示并且当前异步任务等待先前的异步任务?

时间:2014-03-31 16:01:40

标签: android android-asynctask android-progressbar

我在用户登录时启动了一项服务,该服务具有使用 AsyncTask 在后台下载许多附件的功能。

当附件的后台下载正在进行并且用户登录到应用程序时,我将设备从横向旋转到纵向。

纵向,我还有另一种功能,可以使用AsyncTask在后台计算一些数据。此功能包含以下代码 -

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(getActivity());
        pDialog.setMessage("Calculating...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }

    @Override
    protected Integer doInBackground(Integer... args) {
        //Some data processing

    }

    @Override
    protected void onPostExecute(Integer file_url) {
        super.onPostExecute(file_url);

        if(pDialog.isShowing()) {
            pDialog.dismiss();
            pDialog.cancel();
        }

    }

问题是 -

当我将设备旋转为纵向时 -

1)在我重新启动/重新启动应用程序之前,进度对话框永远不会被解雇。

2)纵向布局等待附件后台任务完成,然后才计算出背景中自身布局的异步数据。

3)当异步数据的计算完成后,纵向布局将填充该计算数据,但进度对话框仍然不会被解除,直到应用程序重新启动。

2 个答案:

答案 0 :(得分:1)

您必须记住,在方向更改时,您的资源会重新分配并重新创建(因为Activity本身已被销毁)。

在Android开发者网站上有关于此的一些信息,您可以查看此特定主题here

答案 1 :(得分:0)

使用静态内部Handler来解决这个问题,以处理数据的后台处理。

以下代码完美无缺 -

(纵向方向)

static class BoardHandler extends Handler {
    private final WeakReference<BoardFragment> mService; 

    BoardHandler(BoardFragment service) {
    mService = new WeakReference<BoardFragment>(service);
    }

    @Override
    public void handleMessage(Message msg)
    {
    BoardFragment service = mService.get();
     if (service != null) {
          service.summaryData(msg);

          if(pDialog != null && pDialog.isShowing())
          pDialog.dismiss();
     }
    }
}

public void displayChart(final int maxDays) {

    BoardHandler myHandler = new BoardHandler(this);

    myHandler.sendEmptyMessage(maxDays);

}


 public void summaryData(Message msg)
 {
    //Data processing goes here.
 }

请注意,如何在内部Handler类中使用WeakReference不仅有助于消除内存泄漏,还有助于显示进度对话框。

Progess对话框显示过程在将片段添加到backstack并在活动中执行时完成,而对话框destroy在summaryData method完成执行后调用。

这可能会帮助那些在解决类似问题上花费数天时间的人。