【问题标题】:Can't stop a ProgressDialog in an AsyncTask无法停止 AsyncTask 中的 ProgressDialog
【发布时间】:2012-08-02 01:10:36
【问题描述】:

我有两个不工作的 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)”区域

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

        TimeZoneList();

此行动态填充 Spinner 框并使其停止工作,因此我将其注释掉。

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

//

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

【问题讨论】:

  • 能否在不中断发布代码的情况下描述您的问题?几乎无法理解您的 ASyncTask 是如何实现的。

标签: java android android-asynctask android-progressbar


【解决方案1】:

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

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

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

我不知道InitialiseUI() 是做什么的,但它听起来像是 UI 风格。如果您需要 UI 设置,请在 UI 线程上调用的 preExecute() 中进行。

您可以在doInBackground() 方法中设置一个断点,看看它有多远,然后告诉我们吗?这会有所帮助。

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

mProgressDialog.dismiss();

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

附:您的第一个 AsyncTask 子类中有第二个通用参数 Context。但是,您似乎没有使用它。通常,这将是doInBackground() 通过publishProgress() 传递给onProgressUpdate() 的数据类型。

【讨论】:

  • 我可以让它“返回 null”,然后它永远不会到达 OnPostExecute。在第二个示例中,它到达 OnPostExecute 但锁定在 mProgressDialog.dissmis();这就是它被注释掉的原因。
  • ...到什么?另外,你在看 LogCat 窗口吗?你看到有什么例外吗?您是否有任何带有 try-catch 块的代码,您可以在其中捕获异常但什么也不做(空的 catch 处理程序)?
  • 我将检查 InitialiseUI,因为它确实更新了 UI,但似乎没有问题。
  • mProgressDialog.dissmis(); 甚至拼写不正确,因此如果您取消注释它甚至无法编译。在堆栈溢出上发布时,请不要编辑您的代码。我们需要确切地查看您实际运行的代码。如果您的onPostExecute() 方法除了mProgressDialog.dismiss() 之外什么都没有,它仍然挂起吗?您可以在dismiss() 调用上设置断点,点击它,告诉调试器继续,它永远不会消失?
  • @John,不要doInBackground() 内部更新 UI。请把那个拿出来。如果对InitialiseUI() 的调用不依赖于在doInBackground() 中所做的任何事情,那么您可以将其移至onPreExecute(),对吧?
猜你喜欢
  • 1970-01-01
  • 2015-02-14
  • 2011-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
  • 1970-01-01
相关资源
最近更新 更多