我正在开发我的第一个 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();
}
}
}
我想在这里问一个问题
以上代码已优化且可重用。
提前致谢
问题是您正在转移到新活动而没有忽略进度对话框。这将导致泄漏窗口错误
我想你必须搬家dialogLogin.dismiss();
form onCancelled()
阻止到onPostExecute
阻止你的代码
您必须在进行另一项活动之前执行此操作。即之前
Intent inteProj = new Intent(getApplicationContext(),ProjectFragActivity.class);
startActivity(inteProj);
这行代码。我认为这会解决你的问题
一个疑问:你的 onPreExecute 在哪里?通常我在该块中显示进度代码并在 onPostExecute 中忽略它
通常流程是这样的onPreExecute-->doInBackground --->onPostExecute
EDIT :
onPreExecute:初始化您的 UI 组件(例如:对话)。在您的情况下ProgressDialog
出现
doInBackground:之后onPreExecute
块控制将转到此块。这里ProgressDialog
继续工作
onPostExecute :在所有后台操作之后,控制权来到这里。在这里您可以忽略您的ProgressDialog
并转到您的新活动。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)