Диалог прогресса на открытой деятельности
-
27-09-2019 - |
Вопрос
Эй, ребята, у меня проблема с диалоговым окном прогресса на открытии деятельности (называемая деятельностью 2 в примере). Упражнение 2 имеет много кода для выполнения в этом событии Oncreate.
final ProgressDialog myProgressDialog = ProgressDialog.show(MyApp.this,getString(R.string.lstAppWait), getString(R.string.lstAppLoading), true);
new Thread() {
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
showApps();
}
});
myProgressDialog.dismiss();
}
}.start();
Функция ShowApps начнется активность 2.
Если я выполняю этот код на мою кнопку, нажмите событие на активность 1, я вижу прогресс, но она не двигается, но она не перемещается, и в Afeter есть черный экран в течение 2 или 3 секунды времени для Android, чтобы показать активность.
Если я выполню этот код в OnCreate Of Aification2, и если я заменил ShowApps по коду на OnCreate, Aificate1 Freeze 2 секунды, я не вижу диалоговое окно прогресса и замораживаю еще 2 секунды на активности 2, прежде чем видеть результат.
Идея ?
Решение
У меня была такая же проблема и используя Асинктюз работает для меня.
Существует 3 важных метода переопределения в асинктюз.
- Doinbackground : Это где произойдет мясо вашего фона.
- onPreexecute : Покажите свой ProgressDialog здесь (ShowDialog)
- OnPostexecute : Скрыть свой ProgressDialog здесь (удаление или увольнение)
Если вы делаете подкласс Asynctask в качестве внутреннего класса вашей активности, вы можете позвонить в рамках методов ShowDialog, увольнение и удаление в пределах вашей асинаксической активности.
Вот образец реализации асинктюды:
class LoginProgressTask extends AsyncTask<String, Integer, Boolean> {
@Override
protected Boolean doInBackground(String... params) {
try {
Thread.sleep(4000); // Do your real work here
} catch (InterruptedException e) {
e.printStackTrace();
}
return Boolean.TRUE; // Return your real result here
}
@Override
protected void onPreExecute() {
showDialog(AUTHORIZING_DIALOG);
}
@Override
protected void onPostExecute(Boolean result) {
// result is the value returned from doInBackground
removeDialog(AUTHORIZING_DIALOG);
Intent i = new Intent(HelloAndroid.this, LandingActivity.class);
startActivity(i);
}
}
Другие советы
AFAIK Вы не можете предварительно загрузить любую активность с отображенным диалоговом окна прогресса. Вы тестируете на реальном устройстве или в эмуляторе?
Я видел обходные пути, которые открывали активность с просмотром просмотра, имеющего анимацию прогресса в центре, а на следующем представлении было загружено активность, но это нее рекомендуется и трудно реализовать для работы по желанию.
Пожимание
Я бы предположил, чтобы вы избегали выполнения много операций в деятельности 2, находящиеся на операции. Написать много операций в Oncreate - это причина для черного экрана между мероприятиями .so выполнять эти операции асинхронно используя Асинктюз или в потоке (или напишите их в onstart. Если они неизбежны).
Другое предложение состоит в том, чтобы начать другой прогресс-кадр в активности 2, который будет работать, пока все ваши данные не будут загружены, и пользователь не будет знать, что что-то происходит в фоновом режиме.
Это то, что я бы сделал. Создайте обработчик в потоке пользовательских интернет-пользователей, начните фоновую поток обработки, а затем показать прогресс-файл. Когда фоновая нить закончила, это работает, получите его, чтобы опубликовать прогон для провода на нити UI через обработчик для отклонения диалогового окна.