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();はnullを書き込まないでください

             btn.setOnClickListener(new View.OnClickListener() {      
                public void onClick(View v) {
                        new LoadMoreData().execute();
                }});   
于 2012-07-25T07:37:54.587 に答える
0

さらなる説明といくつかの編集を行うためだけに、ニラリの答えは正しいようです。進行状況ダイアログは、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;
        }
于 2012-07-25T07:48:23.970 に答える