我正在编写我的第一个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;
}
}
答案 0 :(得分:1)
如果Filter.apply()
是时间密集型的,则不应在主线程上运行它。这可能就是动画冻结的原因。如果您看到类似以下内容的日志消息,则可以确认此信息:
“跳过X帧。应用程序可能在主线程上做了太多工作。”
将Filter.apply()
的时间密集型方面卸载到另一个线程上。如果需要,您可以使用其他AsycnTask
来执行此操作。
答案 1 :(得分:0)
onPostExecute()方法是UI线程的一个钩子,AsyncTask对象用它来显示可能需要的任何结果。如果Filter.apply()是一个时间密集型过程,这肯定会冻结UI线程,而Filter.apply()现在正在UI线程上运行,因为它已明确要求在此处运行。
尝试将Filter.apply()委托给它自己的线程来执行CPU密集型任务。