ProgressDialog不会因多个Asynctask实例而解雇

时间:2013-12-12 23:09:00

标签: android android-asynctask progressdialog

我在这个app中有一个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'的Asynctask。 现在,我在MainActivity中有一个Menu,我取消了'task1'引用的Asynctask,并创建了另一个Asynctask实例,将它分配给'task1'。

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

但是在这里,我看到创建了一个在onPostExecute之后解散的进度对话框(我也可以在后台看到我的视图更新),但在此之后,会立即弹出另一个进度对话框,该对话框不会被解除。 不确定,是什么原因造成的。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

问题是当您取消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();
        }