尝试从配置更改中恢复ProgressDialog时遇到以下问题。这是我的代码:
server
是一个在线程中进行网络连接的类,在完成后,它会调用进行初始调用的处理程序的回调。
public class MainActivity extends FragmentActivity {
private boolean hasAuthDialog = false;
ProgressDialog progressDialog;
// login fragment
public void doLogin(View b) {
boolean ok = true;
if(ok) {
progressDialog = new ProgressDialog(this);
progressDialog.setIndeterminate(true);
progressDialog.setMessage("Autenticando");
progressDialog.setCancelable(false);
progressDialog.show();
hasAuthDialog = true;
try {
server.doLogin(cedula.getText().toString(), pass.getText().toString(), new ServerBridgeResponse_CallBack() {
@Override
public void run(Boolean success, Object... args) {
// login finalizado
if(success) {
Toast.makeText(me, "Login success", Toast.LENGTH_LONG).show();
}else{
Toast.makeText(me, "Login error", Toast.LENGTH_LONG).show();
}
progressDialog.dismiss();
hasAuthDialog = false;
}
});
} catch (ServerBridgeNotReadyException e) {
}
}
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putBoolean("hasAuthDialog", hasAuthDialog);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
hasAuthDialog = savedInstanceState.getBoolean("hasAuthDialog");
if(hasAuthDialog) {
progressDialog = new ProgressDialog(this);
progressDialog.setIndeterminate(true);
progressDialog.setMessage("Autenticando restored");
progressDialog.setCancelable(false);
progressDialog.show();
hasAuthDialog = true;
}
}
问题是,在调整方向后,调试时,progressDialog
方法中的doLogin
仍然引用旧对话框,而不是我在onRestoreInstance
中创建的新对话框(I因为这条消息而知道这一点。它仍然说'Autenticando'而不是Autenticando Restored')。我做错了什么?
提前致谢!
答案 0 :(得分:3)
您是否尝试过使用progressDialog静态?这样设置变量将被run方法解除,而不是对旧progressDialog的引用。
答案 1 :(得分:1)
我现在明白了。问题在于,当方向发生变化时,Android会创建一个全新的活动实例。由于此行为,回调中的关键字this
指的是前一个实例。
我们可以解决这个问题的一种方法是按照 Bassiuz 的建议制作progressDialog
静态,但是一个不同的(和IMO更灵活)解决方案是创建一个{{1变量并在static MainActivity me
的末尾分配this
。之后,在onCreate
回调中,使用doLogin
,它应该引用新对话框。
感谢 Bassiuz !