4

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

请参考以下代码并告诉我一些更改

以下是登录活动

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 {
        ............
    }   
}

以下是在 LoginActivity 中扩展 AsyncTask 的内部类

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();
    }
}

}

我想在这里问一个问题

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

提前致谢

4

4 回答 4

11

问题是您在不关闭进度对话的情况下转移到新活动。这将导致泄漏窗口错误

我认为您必须在代码中移动dialogLogin.dismiss();表单onCancelled()onPostExecute

您必须在参加其他活动之前执行此操作。即之前

Intent inteProj = new Intent(getApplicationContext(),ProjectFragActivity.class);
startActivity(inteProj);

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

一个疑问:你的 onPreExecute 在哪里?通常我在该块中显示进度代码并在 onPostExecute 中关闭它

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

编辑 :

onPreExecute:初始化您的 UI 组件(例如:对话框)。在您的情况下ProgressDialog出现

doInBackground :在onPreExecute块控制进入这个块之后,这将。这里ProgressDialog继续它的工作

onPostExecute :在所有后台操作之后控制来到这里。在这里你可以关闭你的ProgressDialog并转到你的新活动。

于 2013-04-23T09:44:43.503 回答
0

可能是因为你在写

Intent inteProj = new Intent(getApplicationContext(),           
ProjectFragActivity.class);
startActivity(inteProj);

在关闭对话框之前,意味着您的对话框仍在显示过程,即使您的活动发生了变化。所以只要把你的

dialogLogin.dismiss();
dialogLogin = null;

在此之前的行

Intent inteProj = new Intent(getApplicationContext(),           
ProjectFragActivity.class);
startActivity(inteProj);

那么这个问题就会得到解决。

于 2013-11-26T05:59:42.540 回答
0

我也有这个问题,这就是造成它的原因。我的应用程序接受输入并将它们添加到 SQLite 数据库。这就是我所拥有的:

 public Item doInBackground(String...params) {
       Item item = new Item();
        try {

            item.setItemName(params[0]);
            item.setSupplierPhone(params[1]);
            ...
            databaseHandler.addItem(item);

            //Toast.makeText(mContext, "Item successfully saved.", Toast.LENGTH_SHORT).show();

            databaseHandler.close();


        } catch (SQLiteException e) {
            Toast.makeText(mContext, "Error saving Item!", Toast.LENGTH_SHORT).show();
        }
        return item;
    }

我认为这是因为我试图在执行路径已经存在后显示一个对话框onPostExecute()

同样重要的是要注意引发此异常的原因有很多。这里讨论了很多

于 2015-06-03T10:29:01.903 回答
0

在转发到下一个活动之前,您需要关闭对话框。使用:- dialog.dismiss();

于 2017-09-21T11:25:48.027 回答