Замените все ваши потоки классами AsyncTask.Они разработаны специально для этого типа вещей и прекрасно работают с пользовательским интерфейсом для отображения диалогов и отклонения их в потоке пользовательского интерфейса, в то же время выполняя фоновую работу там, где вам это нужно.
Таким образом, вы неТайм-аут 3000 мс, он просто сбрасывает, когда возвращается.Конечно, вы можете рассчитать, сколько времени займет вход в систему, и сохранить диалог до тех пор, пока не наберется 3000 мс, если хотите, но я бы не стал.Кроме того, если вы хотите сделать паузу в Android, используйте SystemClock.sleep(3000);
вместо собственного спящего потока java, поскольку вам не нужно пытаться / перехватывать прерывание.
Пример, который заменяет ваш код (обратите внимание на полное отсутствиепотоков, try / catch и т. д., которые обычно засоряют многопоточный код):
// ... initialising onClickListener of your button to call the async task
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
new StartLoginAsyncTask(YOURAPP.this).execute((Void []) null);
}
});
}
private class StartLoginAsyncTask extends AsyncTask<Void, Void, Integer> {
private ProgressDialog dialog;
private final Context context;
public StartLoginAsyncTask(Context context) {
this.context = context;
}
@Override
protected void onPreExecute() {
// UI work allowed here
dialog = new ProgressDialog(context);
// setup your dialog here
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
dialog.setMessage(context.getString(R.string.please_wait_message));
dialog.setCancelable(false);
dialog.show();
}
@Override
protected Integer doInBackground(Void... ignored) {
Integer returnCode = doLogin();
return returnCode;
}
@Override
protected void onPostExecute(Integer returnCode) {
// UI work allowed here
dialog.dismiss();
if (returnCode == LOGIN_OK) {
// ... show other dialogs here that it was OK
} else {
// ... bad news dialog here
}
}
}
private Integer doLogin() {
// ... write your login code here.
// This is run in background, do not do any UI work here
return LOGIN_OK;
}
Если вы хотите, чтобы вход в систему прерывал диалог, добавьте пользовательский TimeoutException
к doLogin()
, перехватите его вdoInBackground()
, вернуть соответствующий целочисленный ответ и обработать его в onPostExecute()
.