我在用户登录时启动了一项服务,该服务具有使用 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)当异步数据的计算完成后,纵向布局将填充该计算数据,但进度对话框仍然不会被解除,直到应用程序重新启动。
答案 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
完成执行后调用。
这可能会帮助那些在解决类似问题上花费数天时间的人。