Вы должны сделать это с помощью AsyncTask (интеллектуальный фоновый поток) и ProgressDialog
AsyncTask позволяет правильно и легко использовать поток пользовательского интерфейса. Этот класс позволяет выполнять фоновые операции и публиковать результаты в потоке пользовательского интерфейса без необходимости манипулировать потоками и / или обработчиками.
Асинхронная задача определяется вычислением, которое выполняется в фоновом потоке и результат которого публикуется в потоке пользовательского интерфейса. Асинхронная задача определяется 3 универсальными типами, называемыми Params, Progress и Result, и 4 шагами, называемыми begin, doInBackground, processProgress и end.
4 шага
Когда выполняется асинхронная задача, задача проходит 4 шага:
onPreExecute()
, вызывается в потоке пользовательского интерфейса сразу после выполнения задачи. Этот шаг обычно используется для настройки задачи, например, показывая индикатор выполнения в пользовательском интерфейсе.
doInBackground(Params...)
, вызывается в фоновом потоке сразу после завершения выполнения onPreExecute (). Этот шаг используется для выполнения фоновых вычислений, которые могут занять много времени. Параметры асинхронной задачи передаются на этот шаг. Результат вычисления должен быть возвращен этим шагом и будет возвращен к последнему шагу. Этот шаг также может использовать publishProgress (Progress ...) для публикации одной или нескольких единиц прогресса. Эти значения публикуются в потоке пользовательского интерфейса на шаге onProgressUpdate (Progress ...).
onProgressUpdate(Progress...)
, вызывается в потоке пользовательского интерфейса после вызова publishProgress (Progress ...). Время выполнения не определено. Этот метод используется для отображения любой формы прогресса в пользовательском интерфейсе, пока выполняется фоновое вычисление. Например, его можно использовать для анимации индикатора выполнения или отображения журналов в текстовом поле.
onPostExecute(Result)
, вызывается в потоке пользовательского интерфейса после завершения фоновых вычислений. Результат фонового вычисления передается на этот шаг в качестве параметра.
Правила потоков
Для правильной работы этого класса необходимо соблюдать несколько правил потоков:
Экземпляр задачи должен быть создан в потоке пользовательского интерфейса.
execute (Params ...) должен быть вызван в потоке пользовательского интерфейса.
Не вызывайте onPreExecute (), onPostExecute (Result), doInBackground (Params ...), onProgressUpdate (Progress ...) вручную.
Задача может быть выполнена только один раз (исключение будет выдано, если будет предпринята вторая попытка).
Пример кода
То, что делает адаптер в этом примере, не важно, важно понимать, что вам нужно использовать AsyncTask для отображения диалогового окна прогресса.
private class PrepareAdapter1 extends AsyncTask<Void,Void,ContactsListCursorAdapter > {
ProgressDialog dialog;
@Override
protected void onPreExecute() {
dialog = new ProgressDialog(viewContacts.this);
dialog.setMessage(getString(R.string.please_wait_while_loading));
dialog.setIndeterminate(true);
dialog.setCancelable(false);
dialog.show();
}
/* (non-Javadoc)
* @see android.os.AsyncTask#doInBackground(Params[])
*/
@Override
protected ContactsListCursorAdapter doInBackground(Void... params) {
cur1 = objItem.getContacts();
startManagingCursor(cur1);
adapter1 = new ContactsListCursorAdapter (viewContacts.this,
R.layout.contact_for_listitem, cur1, new String[] {}, new int[] {});
return adapter1;
}
protected void onPostExecute(ContactsListCursorAdapter result) {
list.setAdapter(result);
dialog.dismiss();
}
}