Невозможно закрыть диалог выполнения
Вот мой сегмент кода, который я пытаюсь закрыть диалог, но он не закрывается, а также я не получаю никакой ошибки на logcat.Пожалуйста, поправьте меня, где я ошибаюсь ?
Весь журнал.V оператор get выполнен.Даже лог.V оператор после pd.dismiss() (Log.v("TAG","progress dismiss");)
печатается.
Пожалуйста, укажите на мою ошибку или предложите какой-нибудь альтернативный способ отклонить progressdialog.
btnSave.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
//do something
} else {
Log.v("TAG","above progressDialog");
final ProgressDialog pd = new ProgressDialog(ChangePassword.this);
ProgressDialog.show(ChangePassword.this, "", "Loading...", false, true);
new Thread() {
public void run() {
try {
sleep(2000);
Log.v("TAG","in try block");
} catch (Exception e) {
Log.e("tag", e.getMessage());
}
// dismiss the progress dialog
pd.dismiss();
// Log.v("TAG","progress dismiss");
}
}.start();
Log.v("TAG","after start");
public void run()
{
try{
if (!(txtOldPass.getText().toString())
.equals(SetGetValues.getPassword())) {
Toast.makeText(ChangePassword.this,
"Invalid Old Password", Toast.LENGTH_SHORT)
.show();
txtOldPass.setText("");
txtNewPass.setText("");
txtCnfPass.setText("");
} else {
if (!(txtNewPass.getText().toString())
.equals(txtCnfPass.getText().toString())) {
Toast.makeText(ChangePassword.this,
"Re-Enter New Password",
Toast.LENGTH_SHORT).show();
txtOldPass.setText("");
txtNewPass.setText("");
txtCnfPass.setText("");
} else {
try {
handler = new Handler();
handler.postDelayed(new Thread (new Runnable(){
JSONStringer loginuser = new JSONStringer()
.object()
.key("userid")
.value(SetGetValues.getUserid()
.trim())
.key("password")
.value(txtCnfPass.getText()
.toString().trim())
.key("oldpassword")
.value(txtOldPass.getText()
.toString().trim())
.endObject();
StringEntity entity = new StringEntity(
loginuser.toString());
JSONObject results = bc
.returnJSONObject(loginuser,
"url");
String message = results
.getString("message");
String isvalid = results
.getString("isvalid");
if (isvalid.contains("FALSE")) {
} else {
//pd.dismiss();
Toast.makeText(
ChangePassword.this,
"Password changed successfully",
Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
//TODO: handle exception
e.printStackTrace();
}
}
}
}catch(Exception e)
{
e.printStackTrace();
}
}
}), 1000);
}
}
});
5 ответов:
Вы не отвергаете тот же ProgressDialog, который вы показываете. Заменить это:
final ProgressDialog pd = new ProgressDialog(ChangePassword.this); ProgressDialog.show(ChangePassword.this, "", "Loading...", false, true);
С этим:
final ProgressDialog pd = ProgressDialog.show(ChangePassword.this, "", "Loading...", false, true);
if (pd.isShowing()) { pd.dismiss(); }
Вместо использования потока используйте асинхронную задачу Использование
Ваша проблема, вероятно, заключается в том, что вы пытаетесь изменить пользовательский интерфейс (закрыть диалоговое окно) из другого потока. Я удивлен, что вы не получаете сообщение об ошибке. Попробуйте отключить диалог из потока пользовательского интерфейса, например, с помощью .runOnUIThread () .
Потому что вы пытаетесь использовать элемент
UI
ThreadprogressDialog
в потоке, отличном от UI . Это будет разрешено черезAsyncTask
,handler
или толькоRunOnUIThread(runnable)
.Читайте больше о них и используйте любой из них .
Просто взгляните эта ссылка может быть полезной
Http://eagle.phys.utk.edu/guidry/android/progressBarExample.html