此问题之前已被问过,但我发现的答案在我的案例中没用。
当用户按下活动1中的按钮时,将打开活动2。活动2必须加载已存储在SharedPreferences中的一些数据。活动2必须在onCreate()中做很多事情,这就是为什么打开它需要一点时间(特别是在较慢的设备上)。与我见过的其他案例不同,Activity不必从互联网上下载数据,因此使用AsyncTask不是我的选择,因为打开活动需要很长时间的原因不是互联网,但原因是必须加载5个列表视图,并且必须进行大量计算才能正确处理数据。
那么在这种情况下如何显示ProgressDialog,而Activity 2正在加载?
答案 0 :(得分:4)
那么在这种情况下,如何在Activity 2中显示ProgressDialog 正在加载?
这不应该是您关心的问题,因为即使您显示ProgressDialog
,它也只会冻结,因为您将阻止主UI线程,因为您的Activity
将很难完成其工作。如果您知道布局创建/数据构建(或者您在onCreate()
方法中执行的任何操作)将花费一些时间,用户会注意到:
ProgressBar
以指示正在为用户完成的工作onCreate()
ProgressBar
这样,您的活动将从工作/加载指示器开始,并在布局可用时进行布局。也许你也可以改进一些东西(五ListViews
似乎有点奇怪)。
答案 1 :(得分:0)
公共类TestActivity扩展了Activity {
ProgressDialog progressDialog;
private Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test);
context = this;
showProgress("Data loading...");
new Thread() {
public void run() {
try {
boolean sucess = loadData();
if (sucess) {
Message alertMessage = new Message();
alertMessage.what = 1;
handle.sendMessage(alertMessage);
} else {
Message alertMessage = new Message();
alertMessage.what = 2;
handle.sendMessage(alertMessage);
}
} catch (Exception e) {
// TODO: handle exception
}
}
}.start();
}
private boolean loadData() {
// load data here
return true;
}
private void showProgress(String msg) {
progressDialog = ProgressDialog
.show(TestActivity.this, null, msg, true);
}
private void hideProgress() {
if (progressDialog != null)
progressDialog.dismiss();
}
Handler handle = new Handler() {
public void handleMessage(android.os.Message msg) {
hideProgress();
if (msg.what == 1) {
Toast.makeText(context, "Data Loaded Sucessfully",
Toast.LENGTH_SHORT).show();
} else if (msg.what == 2) {
Toast.makeText(context, "Data Loading failed ",
Toast.LENGTH_SHORT).show();
}
super.handleMessage(msg);
};
};
}