Java Can';不要停止异步任务中的ProgressDialog

Java 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

我有两个任务不工作。我做错了,这两者一定有共同之处

我的第一个活动需要很长时间才能加载,因此我希望有一个progressDialog/Bar,但它失败了。我使用访问onCreate中的AsyncTask

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