27

いずれかのアクティビティのonCreate()メソッド中に進行状況ダイアログを表示しようとしています。スレッドで画面にデータを入力するための作業を行ってから、進行状況ダイアログを閉じます。

これが私のonCreateMethod()です

dialog = new ProgressDialog(HeadlineBoard.this);
        dialog.setMessage("Populating Headlines.....");
        dialog.show();
        populateTable();

PopulateTableメソッドには、私のスレッドとダイアログを閉じるためのコードが含まれていますが、何らかの理由で。アクティビティが約10秒間空白になり(populateTable()が機能します)、画面が表示されます。ダイアログが表示されたことがありません、アイデアはありますか?

これがpopulateTable()コードです:

//Adds a row to the table for each headline passed in
private void populateTable() {
    new Thread() {
        @Override
        public void run() {
            //If there are stories, add them to the table
            for (Parcelable currentHeadline : allHeadlines) {
                addHeadlineToTable(currentHeadline);
            }
               try {
                     // code runs in a thread
                     runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                dialog.dismiss();
                            }
                     });
               } catch (final Exception ex) {
                   Log.i("---","Exception in thread");
               }
        }
 }.start();

}
4

3 に答える 3

31

「(ParcelablecurrentHeadline:allHeadlines)」のデータがすでにある場合、なぜ別のスレッドでそれを行うのですか?

別のスレッドでデータをポーリングする必要があります。データの収集が終了したら、UIスレッドでpopulateTablesメソッドを呼び出します。

private void populateTable() {
    runOnUiThread(new Runnable(){
        public void run() {
            //If there are stories, add them to the table
            for (Parcelable currentHeadline : allHeadlines) {
                addHeadlineToTable(currentHeadline);
            }
            try {
                dialog.dismiss();
            } catch (final Exception ex) {
                Log.i("---","Exception in thread");
            }
        }
    });
}
于 2012-06-29T00:20:59.847 に答える
12

これはあなたのために働くはずです

 public class MyActivity extends Activity {

    protected ProgressDialog mProgressDialog;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        populateTable();
    }

    private void populateTable() {
        mProgressDialog = ProgressDialog.show(this, "Please wait","Long operation starts...", true);
        new Thread() {
            @Override
            public void run() {

                doLongOperation();
                try {

                    // code runs in a thread
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mProgressDialog.dismiss();
                        }
                    });
                } catch (final Exception ex) {
                    Log.i("---","Exception in thread");
                }
            }
        }.start();

    }

    /** fake operation for testing purpose */
    protected void doLongOperation() {
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
        }

    }
}
于 2012-06-29T00:27:18.317 に答える
5

スレッドを作成して使用する代わりに、これはASyncTaskrunOnUIThreadの完璧な仕事です:

  • onPreExecute、ダイアログを作成して表示します。

  • データをdoInBackground 準備しますが、UIには触れないでください。準備した各データをフィールドに保存してから、を呼び出しますpublishProgress

  • データムフィールドを読み取り、onProgressUpdateUIに適切な変更/追加を行います。

  • onPostExecuteダイアログを閉じます。


スレッドが必要な他の理由がある場合、または既存のスレッドにUIタッチロジックを追加する場合は、runOnUIThread各UIステップに使用して、UIスレッドで短時間だけ実行するために、私が説明したのと同様の手法を実行します。この場合、各データをローカルfinal変数(またはクラスのフィールド)に格納してから、runOnUIThreadブロック内で使用します。

于 2014-11-07T17:20:33.900 に答える