Страница 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
Тогда в родительском классе объявите следующую переменную:

Код: Выделить всё

private Context ctx;
Далее в родительском классе в методе onCreate заполните эту переменную следующим образом:

Код: Выделить всё

ctx = this;
А в классе 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, что ли.