Страница 1 из 1
Асинхронный splash
Добавлено: 13 мар 2013, 15:25
Makute
Доброго времени суток.
Ситуация следующая: приложение "готовится" достаточно долго, все это в потоке находится, который запускается в самом конце OnCreate.
В OnPreExecute потока создаю диалог, который должен оповещать пользователя о подготовке данных, а в OnPostExecute его же закрываю, показываю данные
Проблема в том, что диалог не показывается, но то, что в потоке происходит - выполняется, а на это время приложение находится в "подвешенном состоянии"
Была мысль поставить Splash заставку на это время, по завершении - убрать, ибо это вполне может быть проблемой AlertDialog'a.
В чем может быть проблема и как это сделать?
Re: Асинхронный splash
Добавлено: 14 мар 2013, 09:58
Finch
.show() вызываешь?
Re: Асинхронный splash
Добавлено: 14 мар 2013, 12:47
KamiSempai
Симптомы похожи на неправильный запуск AsyncTask.
Как Вы запускаете асинхронную загрузку?
Re: Асинхронный splash
Добавлено: 14 мар 2013, 14:22
neoksi
Явно что-то не то с контекстом, как вы его передаете в AsyncTask?
Re: Асинхронный splash
Добавлено: 14 мар 2013, 17:54
Makute
Код: Выделить всё
class AdapterSetOne extends AsyncTask<Void, Void, Void> {
AlertDialog.Builder ad = new AlertDialog.Builder(getActivity());
Dialog alert;
@Override
protected void onPreExecute() {
ad.setTitle("Инициализация");
ad.setMessage("Пожалуйста, подождите");
ad.setCancelable(false);
alert = ad.create();
alert.show();
}
@Override
protected Void doInBackground(Void... params) {
Adaptive adapt = new Adaptive();
elements = adapt.FirstList();
FirstScreenAdapter adapter = new FirstScreenAdapter(getActivity(), elements, locat);
setListAdapter(adapter);
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
alert.dismiss();
}
}
Re: Асинхронный splash
Добавлено: 14 мар 2013, 18:49
neoksi
Makute
AdapterSetOne оформлен у вас как субкласс или отдельный класс?
Налицо неверная передача контекста в AlertDialog.Builder...
Re: Асинхронный splash
Добавлено: 14 мар 2013, 19:11
Makute
neoksi писал(а):Makute
AdapterSetOne оформлен у вас как субкласс или отдельный класс?
Налицо неверная передача контекста в AlertDialog.Builder...
Как субкласс.
Re: Асинхронный splash
Добавлено: 14 мар 2013, 20:12
neoksi
Makute
Тогда в родительском классе объявите следующую переменную:
Далее в родительском классе в методе
onCreate заполните эту переменную следующим образом:
А в классе
AdapterSetOne замените это:
Код: Выделить всё
AlertDialog.Builder ad = new AlertDialog.Builder(getActivity());
на это:
Код: Выделить всё
AlertDialog.Builder ad = new AlertDialog.Builder(ctx);
в результате все должно заработать.
Re: Асинхронный splash
Добавлено: 15 мар 2013, 08:30
Makute
У меня родительский класс - фрагмент, а посему getActivity() вполне должен работать
Re: Асинхронный splash
Добавлено: 15 мар 2013, 13:15
KamiSempai
Makute писал(а):У меня родительский класс - фрагмент, а посему getActivity() вполне должен работать
Не обязательно. Если фрагмент не размещен на активити, метод должен вернуть null.
Re: Асинхронный splash
Добавлено: 15 мар 2013, 13:57
rezak90
если фрагмент ещё не приатачен или уже оттачен от активити то getActivity уже будет равна нулю, так как на этой активити уже/ещё нету фрагмента
Re: Асинхронный splash
Добавлено: 15 мар 2013, 17:25
Makute
Фрагмент не находится на активити, он находится внутри ViewPager'a, что никак его не стесняет
Re: Асинхронный splash
Добавлено: 15 мар 2013, 17:30
neoksi
Makute
В общем мы все тут гадаем на кофейной гуще, так как полностью не видим твой код, и каждый раз выясняются новые обстоятельства...
Идея у всех коллег одна, у тебя идет неверная передача контекста, проверяй его передачу, выведи значение в логи и ищи способ передать верный контекст именно активити.
Re: Асинхронный splash
Добавлено: 15 мар 2013, 17:48
KamiSempai
Makute писал(а):Фрагмент не находится на активити, он находится внутри ViewPager'a, что никак его не стесняет
Вот это поворот! Странно, почему NullPointerException не возникает?
Re: Асинхронный splash
Добавлено: 15 мар 2013, 18:08
Makute
Так я и получаю контекст активити через getActivity(), он для этого и создан
Re: Асинхронный splash
Добавлено: 15 мар 2013, 18:26
KamiSempai
Дело в том, что если Вы используете какой либо список, происходит примерно следующее:
Через onCreate создается Активити, там же создается список и прицепляется к Активити.
Затем, уже после того как создастся Активити, начинается заполнение списка.
Создается элемент списка. В Вашем случае это Фрагмент. Фрагмент создается через onCreate, там Вы и пытаетесь вызвать getActivity().
Но проблема состоит в том, что элемент списка цепляется к списку уже после того как отработал метод onCreate, а getActivity() вернет какой либо вменяемый результат только после прикрепления к списку(а следовательно и к Активити).
Re: Асинхронный splash
Добавлено: 15 мар 2013, 19:01
Makute
KamiSempai писал(а):Дело в том, что если Вы используете какой либо список, происходит примерно следующее:
Через onCreate создается Активити, там же создается список и прицепляется к Активити.
Затем, уже после того как создастся Активити, начинается заполнение списка.
Создается элемент списка. В Вашем случае это Фрагмент. Фрагмент создается через onCreate, там Вы и пытаетесь вызвать getActivity().
Но проблема состоит в том, что элемент списка цепляется к списку уже после того как отработал метод onCreate, а getActivity() вернет какой либо вменяемый результат только после прикрепления к списку(а следовательно и к Активити).
А вот это уже плохо.
Дело в том, что прицепляюсь к списку я долго, нудно и в UI потоке, что вешает приложение в очередь исполнения, соответственно мне нужно вывести заставку до прицепления к списку, в моем случае единственный вариант - в момент инициализции viewPager, что ли.