无法在AsyncTask中停止ProgressDialog

时间:2012-08-02 01:10:37

标签: java android android-asynctask android-progressbar

我有两个无效的AsyncTask。我做错了必须有一些共同之处。

我的第一个活动需要很长时间才能加载,所以我希望有一个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

以下这些行在正常情况下工作正常 “public void onCreate(Bundle savedInstanceState)”area

        Ls = new LoadSettings(CreateAppointment.this);
        gs = new GlobalSubs();

        TimeZoneList();

这一行动态填充一个Spinner框并阻止它工作,所以我对它进行了评论。

    //      createTimezone();
        ZoneList(Ls.getCountryZone());

这一行还动态填充了一个spinnerbox,所以我评论了它

    //  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");

//

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

1 个答案:

答案 0 :(得分:1)

你不应该在后台对UI做任何事情。 doInBackground()在后​​台线程上运行。如果您需要在后台处理过程中更新用户界面,请使用publishProgress()(和onProgressUpdate())。

在我看来,你仍然在尝试在这里执行UI操作:

    //  createZone();
    InitialiseUI();
    CreateFileName();

我不知道InitialiseUI()做了什么,但它听起来像UI-ish。如果您需要UI设置,请在preExecute()中执行此操作,该操作在UI线程上调用。

您可以在doInBackground()方法中设置一个断点,看看它有多远,让我们知道吗?那会有所帮助。

在你的第二个例子中,你说onPostExecute()在这里失败了:

mProgressDialog.dismiss();

真的只有一种方法可以让它失败。如果mProgressDialog为空。你能检查一下这个类的构造函数,并确保你记得要实例化它吗?

P.S。您的第一个Context子类中有第二个通用参数AsyncTask。但是,你似乎没有使用它。通常情况下,这是doInBackground()通过onProgressUpdate()传递给publishProgress()的数据类型。