Вы должны сделать это с помощью AsyncTask (умный фоном нити) и ProgressDialog
AsyncTask позволяет правильное и простое использование потока пользовательского интерфейса , Этот класс позволяет выполнять фоновые операции и публиковать результаты в потоке пользовательского интерфейса без необходимости манипулировать потоками и/или обработчиками.
Асинхронная задача определяется вычислением, которое выполняется на фоновом потоке и результат которого публикуется в потоке пользовательского интерфейса. Асинхронная задача определяется тремя универсальными типами, называемыми 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 (Прогресс ...) вручную. задача может быть выполнена только один раз (исключение будет сгенерировано, если второе исполнение попытка.)
Пример кода
Что адаптер делает в этом примере не важно, что более важно, чтобы понять, что вам нужно для использования 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();
}
}
Пожалуйста, отформатируйте свой код, чтобы его можно было прочитать. –