ProgressDialog在AsyncTask中没有正确解除

时间:2014-09-07 23:21:16

标签: android android-asynctask

我正在编写我的第一个Android应用程序,并且在解决onPostExecute中的ProgressDialog时遇到了一些麻烦。我在这里阅读了很多类似的问题,但这些解决方案似乎都无法解决我的特定问题。

对话框出现并且DOES解雇,但它没有按照我想要的方式进行。 Filter.apply()启动时动画会冻结,直到Filter.apply完成后才会消失。 Filter.apply()是另一个从各个地方调用的时间密集型过程。此方法将拥有自己的ProgressDialog。

我做错了什么?

这是我的AsyncTask

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;
}
}

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

onPostExecute()方法是UI线程的一个钩子,AsyncTask对象用它来显示可能需要的任何结果。如果Filter.apply()是一个时间密集型过程,这肯定会冻结UI线程,而Filter.apply()现在正在UI线程上运行,因为它已明确要求在此处运行。

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