我正在尝试在我的一个活动的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();
}
答案 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
块中使用它。