如何使asynctask正常工作

时间:2012-09-27 00:32:46

标签: android

我的应用程序上有一个按钮,如果用户单击它,它将通过调用onResume()刷新当前页面,并且onResume()中有许多数据库操作。我希望在加载数据时使用asynctask来进行progressdialog,而不是让按钮保持按住一段时间。但问题是该按钮仍然处于按下状态,并且progressdialog仅在操作结束时显示很短的持续时间。

RefreshButton.setOnClickListener(new OnClickListener()
        {

            public void onClick(View v)
            {
                onResume();
            }
        });

protected void onResume()
    {
        doneloading = false;
        monResumeloading = new onResumeloading();
        monResumeloading.execute();
        ....loading...

            doneloading = true;
    }

private class onResumeloading extends AsyncTask<Integer, Integer, String>
    {
        private ProgressDialog progressDialog;
        @Override
        protected void onPostExecute(String result)
        {
            progressDialog.dismiss();
        }

        @Override
        protected void onPreExecute()
        {
            progressDialog = new ProgressDialog(StatisticsActivity.this);
            progressDialog.setMessage("Loading...");
            progressDialog.setCancelable(true);
            progressDialog.show();

            Log.i(TAG, "              doneloading=false");
        }

        @Override
        protected void onProgressUpdate(Integer... values)
        {

        }

        @Override
        protected String doInBackground(Integer... params)
        {
            while(!doneloading)
            {
                publishProgress(0);   //dummy
                            log.i(TAG, "loading");
            }
            return null;
        }


    }

我观察到“加载”日志在asynctask执行后立即显示,并在boolean doneloading变为false后立即停止。但progressdialog无法正常工作。请帮帮我:(

1 个答案:

答案 0 :(得分:2)

首先,我认为你不应该在onResume()函数中调用你的AsyncTask。您只需从ClickListener中调用它即可。

现在,在执行AsyncTask之前,您正在执行'.... loading ...'代码。这就是为什么按钮在执行'.... loading ...'时保持按下状态,然后当它完成时,它会执行AsyncTask,它实际上没有做任何事情 - 这就是为什么它只是短时间显示的原因。

将你的'.... loading ...'代码移动到你的AsyncTask的doInBackground()中,它应该可以正常工作。

要点:

  1. 点击:执行AsyncTask
  2. AsyncTask:打开ProgressDialog
  3. AsyncTask:执行你的'... loading ...'代码
  4. AsyncTask:等待'... loading ...'代码完成,同时仍然显示对话框。
  5. AsyncTask:Dismiss ProgressDialog