【问题标题】:Running Alert Dialog While Asynctask is processing正在处理 Asynctask 时运行警报对话框
【发布时间】:2021-12-31 03:23:39
【问题描述】:

我目前有一个 android 应用程序,当单击 Activity 上的按钮时,它会运行 asynctask。当 asynctask 忙于处理其任务时,我希望 Activity 显示一个警报对话框(正在加载...),让我的用户知道应用程序正忙于处理请求,而不仅仅是冻结或崩溃。目前,我的代码是这样写的:

LoadingDialogue.java

public class LoadingDialogue {

private Activity activity;
private AlertDialog dialog;

public LoadingDialogue(Activity myActivity){
    activity = myActivity;
}

public void startLoadingDialogue(){
    AlertDialog.Builder builder = new AlertDialog.Builder(activity);

    LayoutInflater inflater = activity.getLayoutInflater();
    builder.setView(inflater.inflate(R.layout.loading_dialogue,null));
    builder.setCancelable(false);

    dialog = builder.create();
    dialog.show();

}

public void dismissDialog(){
    dialog.dismiss();
}

这就是我在我的活动中实现它的方式:

CustomAsyncTask asyncTask = new CustomAsyncTask();
loadingDialogue.startLoadingDialogue();
String responseString = asynctask.execute().get()
loadingDialogue.dismissDialog();

但是,我的加载对话框没有显示!如果我只是在没有异步任务的情况下执行它,它就可以工作。

谢谢!

【问题讨论】:

  • 不要在你的 asyctask 上使用 .get() 调用。它阻止了一切。在 inPostExecute 中处理结果。使用正常的进度条代替警报。

标签: android android-studio android-asynctask android-alertdialog


【解决方案1】:

该代码在很多方面都被破坏了。

  1. 永远不要使用AsyncTask.execute().get()。这样做会立即得到结果,从而将其从异步变为同步。基本上在那一点上没有理由让它成为异步任务,只需在正文中执行即可。如果你的反应是你需要立即得到结果,那你就不懂异步编程。将任何需要结果的代码放入onPostExecute

    真的忘记了get() 的存在。有一两种情况它可能有用,但 99% 的时间使用它都是错误的。

  2. 只有在主线程返回looper时才会刷新android UI。所以先显示对话框,然后再做get(),再做隐藏它是行不通的——它不会显示,直到整个块完成并且控制返回给循环器,到那时它又被隐藏了。

    改为在onPreExecute 中使用dialog.show() 并在onPostExecute 中隐藏。这将使它工作。

  3. 让一个类拥有这样的对话框有点奇怪。从 AlertDialog 派生一个类并显示/隐藏它更正常。虽然这不一定是错误的,但在某些情况下这可能更方便。

【讨论】:

  • 感谢您的回复!我对 android 编程很陌生,我可以看到 .get() 将如何破坏 asynctasks 的目的。我会尝试使用 onPreExecute 和 onPostExecute 方法。只是想知道......我可以将活动传递给异步任务,并允许异步任务控制何时显示或隐藏加载警报对话框,还是我必须在活动类中添加一个侦听器才能完成此操作?
  • 您可以像传递任何其他参数一样传递 Activity。只有几件事需要担心。首先,永远不要将 Activity 存储在静态变量中。其次,永远不要将它传递给另一个存储它的 Activity 或 Service。第三,不要将它传递给具有长或无限生命周期的 Thread 或 AsyncTask。这样做的原因是,如果这样做了,整个Activity的内存就会泄露,其中包括所有的高内存图形组件。生命周期以秒为单位的线程或任务是可以的,因为它会延迟但不会阻止垃圾收集。
猜你喜欢
  • 2011-12-25
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多