我正在开发我的第一个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并转到你的新活动.
| 归档时间: |
|
| 查看次数: |
14845 次 |
| 最近记录: |