我正在使用下面的代码,我想在前面显示对话框并在后台加载内容,但不能这样做。请指教。
dialog = ProgressDialog.show(this, "", "Loading. Please wait...", true);
runOnUiThread(new Runnable(){
public void run() {
setContentView(R.layout.main_layout);
dialog.dismiss();
}
});
我正在使用下面的代码,我想在前面显示对话框并在后台加载内容,但不能这样做。请指教。
dialog = ProgressDialog.show(this, "", "Loading. Please wait...", true);
runOnUiThread(new Runnable(){
public void run() {
setContentView(R.layout.main_layout);
dialog.dismiss();
}
});
我通过阅读以下链接得到了解决方案,并实现了如下代码:http: //developer.android.com/guide/appendix/faq/commontasks.html#threading
int glb=0,glbtotal=3;
final Handler mHandler = new Handler();
// Create runnable for posting
final Runnable mUpdateResults = new Runnable() {
public void run() {
updateResultsInUi();
}
};
public void open_next_screen()
{
dialog = ProgressDialog.show(this, "", "Loading. Please wait...", true);
startLongRunningOperation();
}
private void updateResultsInUi() {
// Back in the UI thread -- update our UI elements based on the data in mResults
switch(glb)
{
case 0:
setContentView(R.layout.main_layout);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title);
break;
case 1:
part2();
break;
case 2:
part3();
break;
}
}
protected void startLongRunningOperation() {
// Fire off a thread to do some work that we shouldn't do directly in the UI thread
Thread t = new Thread() {
public void run() {
for(glb=0;glb<glbtotal;glb++)
{
mHandler.post(mUpdateResults);
switch(glb)
{
case 0:
part1();
break;
}
}
dialog.dismiss();
}
};
t.start();
}
在Android 开发者的网站上有一个如何在单独的线程中加载的示例。要查看实际代码,请展开进度对话框部分末尾的视图。
但是,对于您的特定情况,您需要重新设计您的工作方式。什么花了这么长时间以至于您需要一个进度对话框?您应该在第二个线程中加载它,同时使用 setContentView 显示某种临时布局。然后,一旦线程完成加载,要么再次调用 setContentView,要么更改文本、图像或您使用线程加载的任何内容。
最后:如果您真的不熟悉 Android 编程,我会暂时避免尝试使用单独的线程和复杂的加载内容。这有点棘手,首先要了解很多。
听起来你想要一个启动屏幕或其他东西,但设置内容视图不应该在线程中完成。发布 layout.xml,其中的内容需要这么长时间才能呈现。