异步任务不显示按钮单击事件的进度对话框

时间:2012-07-25 07:29:26

标签: android

在我的应用程序中,当我点击Button时,它有时会显示progressdialog,有时候不会在点击按钮时显示progressdialog。

异步任务代码是:

public class LoadData extends AsyncTask<Void, Void, Void>
    {
        ProgressDialog pd;
        @Override
        protected void onPreExecute()
        {
            pd = ProgressDialog.show(MainActivity.this, "", "Loading...");
        }
        @Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub
            MainActivity.this.runOnUiThread(new Runnable() {

                public void run() {
                    // TODO Auto-generated method stub
                    LoadActivities(); // function to load data from url 

                }
            });
            return null;
        }
        @Override
        protected void onPostExecute(Void unused) 
        {
            pd.dismiss();    
        }

    }

并在按钮点击事件中将其称为:

btn.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        new LoadMoreData().execute(null);
    }
});  

3 个答案:

答案 0 :(得分:3)

错误地认为你在doInBackground使用runOnUiThreade。只需从代码中删除它。它解决了你的问题。

永远不要在doInBackground中使用任何线程。

答案 1 :(得分:1)

为什么你在 doInBackground 中再次使用run方法,doInBackground方法在后台线程上执行计算,所以不需要采用 runOnUiThread

      MainActivity.this.runOnUiThread(new Runnable() {

            public void run() {
                // TODO Auto-generated method stub
                LoadActivities(); // function to load data from url 

            }
        });

只需写下

protected Boolean doInBackground(final String... args) {
        try {
            LoadActivities(); 
            return true;
        } catch (Exception e) {
            Log.e("tag", "error", e);
            return false;
        }
    }

并且还要更改new LoadMoreData().execute();不写空

             btn.setOnClickListener(new View.OnClickListener() {      
                public void onClick(View v) {
                        new LoadMoreData().execute();
                }});   

答案 2 :(得分:0)

Nirali的回答似乎是正确的,只是为了进一步解释和一些编辑。 进度对话框将在doInBackground方法返回值时显示。在你的代码中它只是创建另一个线程,并完成执行,所以要在LoadActivities执行时显示进度对话框,在doInBackground执行的同一个线程中执行该语句,所以改为以下:

@Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub
            MainActivity.this.runOnUiThread(new Runnable() {

            LoadActivities(); // function to load data from url 
            return null;
        }