gpt4 book ai didi

java - 如何在不导致窗口泄漏的情况下将 ProgressDialog 与 AsyncTask 一起正确使用?

转载 作者:行者123 更新时间:2023-11-30 03:16:11 25 4
gpt4 key购买 nike

我有一个显示 ProgressDialog 的 AsyncTask。 AsyncTask 在 Activity 启动时启动:

public class MyActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_layout);
new MyTask().execute();
}

// ... other code

private class MyTask extends AsyncTask<Void, Void, Void>{
private ProgressDialog dialog = new ProgressDialog(MyActivity.this);
@Override
protected void onPreExecute() {
dialog.show();
}

@Override
protected Void doInBackground(Void... voids) {
// get data from a server
return null;
}

@Override
protected void onPostExecute(Void aVoid) {
// call to a method in MyActivity which updates the UI.
if (dialog.isShowing()) {
dialog.dismiss();
}
}
}
}

此代码运行良好,直到我旋转我的屏幕。这是有道理的,因为用于创建对话框的上下文不再存在(因为旋转时会重新创建 Activity ),并且会导致窗口泄漏。

我能想到的唯一解决方案不是一个很好的解决方案:创建任务和对话框的静态实例,并在 Activity 被销毁时简单地关闭对话框,如果任务被破坏,则在 oncreate 方法中重新创建对话框仍在运行。

那么我如何在不丢失功能的情况下解决这样的问题(因此在任务运行时必须始终显示对话框,并且应该允许旋转设备)?

最佳答案

正如 Raghunandan 在他的评论中所建议的那样,我研究了 Fragments 并解决了我的问题。

我创建了一个启动我的 AsyncTask 的 fragment ,如 blogpost 中所述Raghunandan 提供的。

为了确保我的 Dialog 没有泄露,我创建了一个 DialogFragment,如所述 here (基本对话框)。

这是我的工作代码:

我的 Activity :

public class MyActivity extends Activity implements MyTaskFragment.TaskCallbacks {
private MyTaskFragment task;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_layout);

FragmentManager fm = getFragmentManager();
task = (MyTaskFragment) fm.findFragmentByTag("myTask");

if (task == null) {
task = new MyTaskFragment();
fm.beginTransaction().add(task, "myTask").commit();
}
}

@Override
public void onPreExecute() {
FragmentTransaction ft = getFragmentManager().beginTransaction();
Fragment prev = getFragmentManager().findFragmentByTag("myDialog");
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack(null);

StringProgressDialogFragment dialog = StringProgressDialogFragment.newInstance("My message");
dialog.show(ft, "myDialog");
}

@Override
public void onPostExecute() {
StringProgressDialogFragment dialog = (StringProgressDialogFragment) getFragmentManager().findFragmentByTag("myDialog");
if (dialog!=null) {
dialog.dismiss();
}
// update UI
}

// ... other code
}

我的任务 fragment :

public class MyTaskFragment extends Fragment {
private TaskCallbacks mCallbacks;
private Task mTask;

@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mCallbacks = (TaskCallbacks) activity;
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// Retain this fragment across configuration changes.
setRetainInstance(true);

// Create and execute the background task.
mTask = new Task();
mTask.execute();
}

@Override
public void onDetach() {
super.onDetach();
mCallbacks = null;
}

private class Task extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
mCallbacks.onPreExecute();
}

@Override
protected Void doInBackground(Void... voids) {
// do stuff
return null;
}

@Override
protected void onPostExecute(Void aVoid) {
mCallbacks.onPostExecute();
}
}

public static interface TaskCallbacks {
void onPreExecute();
void onPostExecute();
}
}

我的对话 fragment :

public class StringProgressDialogFragment extends DialogFragment {
private String message;

public static StringProgressDialogFragment newInstance(String message) {
StringProgressDialogFragment dialog = new StringProgressDialogFragment();
Bundle args = new Bundle();
args.putString("message", message);
dialog.setArguments(args);
return dialog;
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
ProgressDialog dialog = new ProgressDialog(getActivity());
message = getArguments().getString("message");
dialog.setMessage(message);
return dialog;
}
}

关于java - 如何在不导致窗口泄漏的情况下将 ProgressDialog 与 AsyncTask 一起正确使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20075059/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com