Java Can';不要停止异步任务中的ProgressDialog
我有两个任务不工作。我做错了,这两者一定有共同之处 我的第一个活动需要很长时间才能加载,因此我希望有一个progressDialog/Bar,但它失败了。我使用访问onCreate中的AsyncTaskJava Can';不要停止异步任务中的ProgressDialog,java,android,android-asynctask,android-progressbar,Java,Android,Android Asynctask,Android Progressbar,我有两个任务不工作。我做错了,这两者一定有共同之处 我的第一个活动需要很长时间才能加载,因此我希望有一个progressDialog/Bar,但它失败了。我使用访问onCreate中的AsyncTask new HeavyWorker(this).execute(); public class HeavyWorker extends AsyncTask < String , Context , Void > { private ProgressDialog p
new HeavyWorker(this).execute();
public class HeavyWorker extends AsyncTask < String , Context , Void > {
private ProgressDialog progressDialog ;
private Context targetCtx ;
public HeavyWorker ( Context context ) {
this.targetCtx = context ;
// this.needToShow = true;
progressDialog = new ProgressDialog ( targetCtx ) ;
progressDialog.setCancelable ( false ) ;
progressDialog.setMessage ( "Retrieving data..." ) ;
progressDialog.setTitle ( "Please wait" ) ;
progressDialog.setIndeterminate ( true ) ;
}
@ Override
protected void onPreExecute ( ) {
progressDialog.show ( ) ;
}
@ Override
protected Void doInBackground ( String ... params ) {
// Do Your WORK here
这一行动态填充微调器框并使其停止工作,因此我将其注释掉
// createTimezone();
ZoneList(Ls.getCountryZone());
这一行也动态地填满了喷丝板盒,所以我把它注释掉了
// createZone();
InitialiseUI();
CreateFileName();
return null ;
}
这个区域永远都到不了
@ Override
protected void onPostExecute ( Void result ) {
if(progressDialog != null && progressDialog.isShowing()){
progressDialog.dismiss ( ) ;
}
}
}
我的第二页也出现了同样的问题我还尝试了在设置页面中使用稍微不同的代码。 现在已修复:
//
private class MyClass extends AsyncTask<Void, Void, Void>{
ProgressDialog mProgressDialog;
public MyClass(){
mProgressDialog = new ProgressDialog(Preferences.this);
mProgressDialog.setMessage ("Please Wait While Saving");
mProgressDialog.setTitle("Saving");
唯一有效的方法是当我注释掉这行内容并更改为其他活动时
// mProgressDialog.dismiss();
Toast.makeText(Preferences.this, "Your Settings Where Saved.", Toast.LENGTH_SHORT).show();
gotoMainPage();
}
}
private void gotoMainPage(){
Intent a = new Intent(this, Main_entry.class);
finish();
startActivity(a);
}
你不应该在后台对UI做任何事情
doInBackground()
在后台线程上运行。如果需要在后台过程中更新UI,可以使用publishProgress()
(和onProgressUpdate()
)进行更新
在我看来,您仍在尝试在此处执行UI操作:
//createZone();
InitialiseUI();
CreateFileName();
我不知道InitialiseUI()
做了什么,但听起来像是UI。如果需要UI设置,请在UI线程上调用的preExecute()
中进行设置
你能在doInBackground()
方法中设置一个断点,看看它能走多远,然后告诉我们吗?那会有帮助的
在第二个示例中,您在这里说它在onPostExecute()
中失败:
mProgressDialog.disclose();
这真的只有一种方法会失败。如果mProgressDialog
为空。你能检查这个类的构造器,并确保你记得实例化它吗
另外,在第一个
AsyncTask
子类中,第二个通用参数为Context
。但是,你似乎没有使用它。通常,这将是doInBackground()
通过publishProgress()
传递给onProgressUpdate()
的数据类型,您不应该在后台对UI做任何操作doInBackground()
在后台线程上运行。如果需要在后台过程中更新UI,可以使用publishProgress()
(和onProgressUpdate()
)进行更新
在我看来,您仍在尝试在此处执行UI操作:
//createZone();
InitialiseUI();
CreateFileName();
我不知道InitialiseUI()
做了什么,但听起来像是UI。如果需要UI设置,请在UI线程上调用的preExecute()
中进行设置
你能在doInBackground()
方法中设置一个断点,看看它能走多远,然后告诉我们吗?那会有帮助的
在第二个示例中,您在这里说它在onPostExecute()
中失败:
mProgressDialog.disclose();
这真的只有一种方法会失败。如果mProgressDialog
为空。你能检查这个类的构造器,并确保你记得实例化它吗
另外,在第一个
AsyncTask
子类中,第二个通用参数为Context
。但是,你似乎没有使用它。通常,这将是doInBackground()
通过publishProgress()
传递到onProgressUpdate()
的数据类型。您能描述一下您的问题而不中断发布的代码吗?你的ASyncTask是如何实现的,这几乎是不可理解的。你能描述一下你的问题而不打断发布的代码吗?很难理解异步任务是如何实现的。我可以将其设置为“returnnull”,然后再也不能设置为OnPostExecute。在第二个示例中,它进入OnPostExecute,但锁定在mProgressDialog.dissmis()上;这就是为什么它被注释掉了。。。。为了什么?还有,你在看LogCat窗口吗?你看到有什么例外吗?您是否有任何带有try catch
块的代码,在这些块中,您捕获异常,但不执行任何操作(空catch
处理程序)?我将检查InitialiseUI,因为它确实更新了UI,但似乎没有问题。mProgressDialog.dissmis()
甚至拼写不正确,因此如果取消注释,它甚至无法编译。在堆栈溢出上发布时,请不要编辑您的代码。我们需要确切地了解您实际运行的代码。如果您的onPostExecute()
方法只有mProgressDialog.disease()
,它仍然挂起吗?您可以在dismise()
调用上设置断点,点击它,告诉调试器继续,它永远不会消失?@John,不要从doInBackground()内部更新UI
。请把它拿出来。如果对InitialiseUI()
的调用不依赖于在doInBackground()
中所做的任何事情,那么您可以将其移动到onPreExecute()
,对吗?我可以将其设置为“returnnull”,然后它永远不会到达OnPostExecute。在第二个示例中,它进入OnPostExecute,但锁定在mProgressDialog.dissmis()上;这就是为什么它被注释掉了。。。。为了什么?还有,你在看LogCat窗口吗?你看到有什么例外吗?您是否有任何带有try catch
块的代码,在这些块中,您捕获异常,但不执行任何操作(空catch
处理程序)?我将检查InitialiseUI,因为它确实更新了UI,但似乎没有问题。mProgressDialog.dissmis()
甚至拼写不正确,因此如果取消注释,它甚至无法编译。在堆栈溢出上发布时,请不要编辑您的代码。我们需要确切地了解您实际运行的代码。如果您的onPostExecute()
方法只有mProgressDialog.disease()
,则它是
@Override
protected void onPreExecute() {
super.onPreExecute();
mProgressDialog.show(Preferences.this, "Saving", "Please Wait a Sec");
}
@Override
protected Void doInBackground(Void... params)
{
saveSettings();
return null;
}
@Override
protected void onPostExecute(Void unused) {
// mProgressDialog.dismiss();
Toast.makeText(Preferences.this, "Your Settings Where Saved.", Toast.LENGTH_SHORT).show();
gotoMainPage();
}
}
private void gotoMainPage(){
Intent a = new Intent(this, Main_entry.class);
finish();
startActivity(a);
}