1

在我的应用程序中,当我单击按钮时,它有时会显示进度对话框,有时在单击按钮时不显示进度对话框。

异步任务代码为:

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

3 回答 3

3

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

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

于 2014-09-20T16:18:03.970 回答
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();
                }});   
于 2012-07-25T07:37:54.587 回答
0

Nirali 的回答似乎是正确的,只是为了进行进一步的解释和一些编辑。进度对话框将在 doInBackground 方法返回值时显示。并且在您的代码中它只是创建另一个线程并完成执行,因此要在 LoadActivities exectues 执行时显示进度对话框,请在执行 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;
        }
于 2012-07-25T07:48:23.970 回答