【问题标题】:ProgressDialog does not dismiss properly in AsyncTaskProgressDialog 在 AsyncTask 中没有正确关闭
【发布时间】:2014-09-07 23:21:16
【问题描述】:

我正在编写我的第一个 Android 应用程序,但在关闭 onPostExecute 中的 ProgressDialog 时遇到了一些问题。我已经在 SO 上阅读了许多类似的问题,但这些解决方案似乎都没有解决我的特定问题。

对话框出现并关闭,但它没有按照我想要的方式进行。动画在 Filter.apply() 启动时冻结,直到 Filter.apply 完成后才会关闭。 Filter.apply() 是另一个从不同地方调用的时间密集型过程。这个方法会有自己的 ProgressDialog。

我做错了什么?

这是我的异步任务

public class JSONFetchFMTask extends AsyncTask<Void, Void, Void> {

private Activity activity;
private ProgressDialog dialog;

public JSONFetchFMTask() {}

@Override
protected void onPreExecute() {
    Context context = FM.getAppContext();
    Activity activity = ((FM)context.getApplicationContext()).getCurrentActivity();
    dialog = ProgressDialog.show(activity, "", "Downloading Data", true);
}

@Override
protected Void doInBackground(Void... params) {
   // Process intensive code was here
    return null;
}

@Override
protected void onPostExecute(Void result) {
    if (dialog != null && dialog.isShowing()) {
      dialog.dismiss();
   }
    Filter.apply();
}
}

这是我的 FM 课:

public class FM extends Application {

private static Context context;
private Activity currentActivity;


public void onCreate(){
    super.onCreate();
    FM.context = getApplicationContext();
}

public static Context getAppContext() {
    return FM.context;
}

public Activity getCurrentActivity(){
    return this.currentActivity;
}

public void setCurrentActivity(Activity currentActivity) {
    this.currentActivity = currentActivity;
}
}

【问题讨论】:

    标签: android android-asynctask


    【解决方案1】:

    如果Filter.apply() 是时间密集型的,则不应在主线程上运行它。这可能就是动画冻结的原因。如果您看到类似以下内容的日志消息,您可以确认这一点:

    “跳过 X 帧。应用程序可能在主线程上做了太多工作。”

    Filter.apply() 的时间密集方面卸载到另一个线程。如果需要,您可以使用另一个 AsycnTask 来执行此操作。

    【讨论】:

    • 这解决了这个问题。过滤器写得很糟糕,runOnUiThread() 中有很多不应该存在的代码。我已经重构了这个,一切都好多了。我仍然有一些问题,但如果我自己无法解决,那将是一个单独的问题。
    • 很高兴你把一切都弄清楚了。
    【解决方案2】:

    onPostExecute() 方法是 AsyncTask 对象用来显示可能需要的任何结果的 UI 线程的挂钩。如果 Filter.apply() 是一个耗时的过程,这肯定会冻结 UI 线程,并且 Filter.apply() 现在正在 UI 线程上运行,因为它被明确要求在这里运行。

    尝试将 Filter.apply() 委托给它自己的线程来执行 CPU 密集型任务。

    【讨论】:

      猜你喜欢
      • 2015-05-12
      • 2012-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多