Android runOnUiThread说明

时间:2012-06-29 00:01:56

标签: android

我正在尝试在我的一个活动的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();

}

3 个答案:

答案 0 :(得分:28)

如果你已经拥有“for(Parcelable currentHeadline: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");
            }
        }
    });
}

答案 1 :(得分:6)

这应该对你有用

 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) {
        }

    }
}

答案 2 :(得分:3)

而不是创建一个主题,并使用runOnUIThread,这对于ASyncTask来说是一个完美的工作:

  • onPreExecute中,创建&显示对话框。

  • doInBackground 准备数据,但不要触摸用户界面 - 将每个准备好的数据存储在一个字段中,然后调用publishProgress

  • onProgressUpdate中阅读基准字段&对UI进行适当的更改/添加。

  • onPostExecute中关闭对话框。


如果您有其他理由想要一个线程,或者正在向现有线程添加触摸UI的逻辑,那么使用类似的技术来执行我所描述的,仅在短时间内在UI线程上运行{{1}每个UI步骤。在这种情况下,您将每个数据存储在本地runOnUIThread变量中(或类的字段中),然后在final块中使用它。