【问题标题】:ProgressDialog doesn't dismiss with multiple instances of AsynctaskProgressDialog 不会因 Asynctask 的多个实例而消失
【发布时间】:2013-12-12 23:08:59
【问题描述】:

我在这个应用中有一个 Asynctask,我在 onPreExecute 中有一个 ProgressDialog。

    ProgressDialog pDialog;

    protected void onPreExecute() {

        pDialog = new ProgressDialog(Synchronization.this);
        pDialog.setMessage(Html.fromHtml("<b>Please Wait</b><br/>Working..."));
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();

    }

并且,在 onPostExecute 中,我关闭了这个对话框。

                    protected void onPostExecute(ArrayList<Object> allShopsData) {
        // TODO Auto-generated method stub
        super.onPostExecute(allShopsData);

        final ArrayList<Object> allShops = allShopsData;

        // dismiss the dialog after getting all products
        if(pDialog!=null && pDialog.isShowing())
        pDialog.dismiss();

        // updating UI from Background Thread
        runOnUiThread(new Runnable() {
            public void run() {
                ExpandableListView expandableList = (ExpandableListView) findViewById(R.id.expandlist);

                expandableList.setDividerHeight(2);
                expandableList.setGroupIndicator(null);
                expandableList.setClickable(true);

                MyExpandableAdapter adapter = new MyExpandableAdapter(taskList,
                        allShops);

                adapter.setInflater(
                        (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE),
                        Synchronization.ref);
                expandableList.setAdapter(adapter);

            }
        });

    }

我在同步(我的主活动)onCreate() 中启动名为“task1”的异步任务。 现在,我在 MainActivity 中有一个菜单,我在其中取消了“task1”引用的 Asynctask,并创建了另一个 Asynctask 实例,将其分配给“task1”。

                task1.cancel(true);
                task1 = new GetShopsTask();
                task1.execute(taskList);

但是在这里,我看到创建的一个进度对话框在 onPostExecute 之后关闭(我还可以看到我的视图在后台更新),但在此之后,另一个进度对话框弹出,它不会被关闭。 不确定,是什么部分造成的。有人可以帮忙吗?

【问题讨论】:

  • 我不确定这是否会导致您的问题,但请从onPostExecute() 中删除runOnUiThread。这是不必要的,因为onPostExecute()UI Thread 上运行,它可能会导致问题/混乱
  • 你在哪里定义ProgressDialog?会不会是两个AsyncTasks 互相干扰,而第二个覆盖了第一个的pDialog 引用?
  • codemagic- 我刚刚从我的代码中删除了 runOnUiThread,但仍然是相同的行为。
  • SimonSays- 我尝试将其定义为实例变量以及 Asynctask 的本地变量。不幸的是,这没有任何区别。

标签: android android-asynctask progressdialog


【解决方案1】:

问题是当您取消 AsyncTask 时,不会调用 onPostExecute 而是调用 onCanceled()。请参阅 AsyncTask 源。

private void finish(Result result) {
        if (isCancelled()) {
            onCancelled(result);
        } else {
            onPostExecute(result);
        }
        mStatus = Status.FINISHED;
    }

因此您的进度对话框不会关闭,因为永远不会调用 onPostExecute。您可以通过将其添加到异步任务来解决问题:

        @Override
        protected void onCancelled()
        {
             // dismiss the dialog on canceled task
             if(pDialog!=null && pDialog.isShowing())
                pDialog.dismiss();
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多