尝试恢复savedInstance时出错 - Android

时间:2015-12-30 16:21:55

标签: android

尝试从配置更改中恢复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')。我做错了什么?

提前致谢!

2 个答案:

答案 0 :(得分:3)

您是否尝试过使用progressDialog静态?这样设置变量将被run方法解除,而不是对旧progressDialog的引用。

答案 1 :(得分:1)

我现在明白了。问题在于,当方向发生变化时,Android会创建一个全新的活动实例。由于此行为,回调中的关键字this指的是前一个实例。

我们可以解决这个问题的一种方法是按照 Bassiuz 的建议制作progressDialog静态,但是一个不同的(和IMO更灵活)解决方案是创建一个{{1变量并在static MainActivity me的末尾分配this。之后,在onCreate回调中,使用doLogin,它应该引用新对话框。

感谢 Bassiuz