Android:由于进度对话框,活动已泄露窗口?

Nil*_*esh 4 android

我正在开发我的第一个Android应用程序,我想在用户点击我的应用程序中的登录按钮时显示进度对话框.所以我在集成应用的AsyncTask,如登录注销成功完成,但问题是,在成功登录像LoginActivity这给我的错误已经泄露,由于进度对话框窗口中的所有操作.如何关闭进度对话框并更新UI.

请参考以下代码并告诉我一些变化

以下是LoginActivity

public class LoginActivity extends SherlockActivity {
.................
@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    sessionmngr = new SessionManager(this);
    //check the user login or not
    if (sessionmngr.isLoggedIn()) {
        Intent checkLoginIntnt = new Intent(this,ProjectFragActivity.class);
        startActivity(checkLoginIntnt);
    }
    setContentView(R.layout.activity_login);
    ........
}
// onclick listener when click on login activity

public void LoginToBookingScape(View v) throws JSONException {

    username = edtTxtUserName.getText().toString();
    userpsw = edtTxtUserPsw.getText().toString();

    if ((username.trim().length() > 0)&&(userpsw.trim().length() > 0)) {

        JsonWebService jsonWebs = new JsonWebService();
        jsonWebs.execute(loginUrl);

    }else {
        ............
    }   
}
Run Code Online (Sandbox Code Playgroud)

以下是在LoginActivity中扩展AsyncTask的Inner类

private class JsonWebService extends AsyncTask<String,Void,String> {

    private ProgressDialog dialogLogin;
    @Override
    protected String doInBackground(String... url) {

                httpPost.setEntity(new UrlEncodedFormEntity(params));
                ....
                inStream = httpEntity.getContent();
                .........
                return jsonResp;
    }

    @Override
    protected void onPostExecute(String jsonData) {
        //get string data from doinBackground
        try {
            JSONObject jsonObj = new JSONObject(jsonData);
            String key_login = jsonObj.getString(KEY_LOGIN);

            if (key_login.equalsIgnoreCase("0")) {
                .............

            }else {
                ....
                sessionmngr = new SessionManager(getApplicationContext());

                sessionmngr.createLoginSession(id,jsonObj.getString(KEY_UNAME), 
                        jsonObj.getString(KEY_UEMAIL));

                dialogLogin = ProgressDialog.show(LoginActivity.this, "Bookingscape", 
                        "Please Wait",true);
                dialogLogin.setIcon(R.drawable.icon);
                new Thread(new Runnable() {

                    @Override
                    public void run() {
                        try {
                            Thread.sleep(4000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();

                Intent inteProj = new Intent(getApplicationContext(),           

                    ProjectFragActivity.class);
                startActivity(inteProj);
                finish();   
            }
        ........
    }
    @Override
    protected void onCancelled() {
        dialogLogin.dismiss();
        dialogLogin = null;
        super.onCancelled();
    }
}
Run Code Online (Sandbox Code Playgroud)

}

我想在这里问一个问题

上面的代码是优化和可重用的.

提前致谢

edw*_*win 11

问题是你在不放弃进度对话的情况下转向新的活动.这将导致泄露的窗口错误

我认为你必须在代码中移动dialogLogin.dismiss();form onCancelled()block to onPostExecuteblock

你必须在去另一项活动之前这样做.即之前

Intent inteProj = new Intent(getApplicationContext(),ProjectFragActivity.class);
startActivity(inteProj);
Run Code Online (Sandbox Code Playgroud)

这行代码.我认为这将解决您的问题

一个疑问:你的onPreExecute在哪里?通常我在该块中显示进度代码并在onPostExecute中将其解除

通常流程是这样的 onPreExecute-->doInBackground --->onPostExecute

编辑:

onPreExecute:初始化你的UI组件(例如:Dialoges).在你的情况下ProgressDialog出现

doInBackground:在onPreExecute块控制进入此块之后,这将是.ProgressDialog继续它的工作

onPostExecute:控制在所有后台操作后来到这里.在这里你可以解雇你ProgressDialog并转到你的新活动.