Service. Проблема получения данных из сервиса

Ответить
disabler92
Сообщения: 2
Зарегистрирован: 03 июл 2014, 02:17

Service. Проблема получения данных из сервиса

Сообщение disabler92 » 03 июл 2014, 03:20

Здравствуйте.
В общем так. Есть две активити и сервис. На первой активити имеется кнопка, по нажатию на которую запускается вторая активити. Вторая активити содержит ListView, который содержит то, что загружает сервис из интернета. Сервис стартует вместе с созданием первой активити и сразу начинает работу. Загрузка содержимого из инета и формирование ArrayList'а для ListView занимает у сервиса N-е количество времени. Проблема: если после старта сервиса нажать на кнопку в первой активити раньше, чем пройдет N-e количество времени(сервис не успеет сформировать ArrayList), то вылетит исключение. Попробовал использовать AsynсTask, но работает через раз, да и то, пришлось писать костыльные циклы while.

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

public class ListNewsActivity extends Activity {

	private ListView listViewNews;
	private ArrayList<String> arrayListTitleNews;
	private ArrayList<String> arrayListLinkNews;
	private Context mainContext = this;
	private ArrayAdapter<String> adapt;
	private ServiceConnection sConn;
	private LoadNewsService myService;
	
	class MyTask extends AsyncTask<Void, Void, Void>
	{
		@Override
		protected void onPreExecute() {
			// TODO Auto-generated method stub
			super.onPreExecute();
		}
		
		@Override
		protected Void doInBackground(Void... params) {
			// TODO Auto-generated method stub
			sConn = new ServiceConnection() {
				
				@Override
				public void onServiceDisconnected(ComponentName name) {
					// TODO Auto-generated method stub			
				}
				
				@Override
				public void onServiceConnected(ComponentName name, IBinder service) {
					// TODO Auto-generated method stub
					myService = ((LoadNewsService.Loader) service).getService();
				}
			};
			bindService(new Intent(mainContext, LoadNewsService.class), sConn, 0);

			while(myService == null)
			{
				System.out.println("myService == null");
			}
			
			while(myService.getListTitle() == null)
			{
				System.out.println("myService.getListTitle() == null");
			}
			arrayListTitleNews = myService.getListTitle(); 
			
			return null;
		}
		
		@Override
		protected void onPostExecute(Void result) {
			// TODO Auto-generated method stub
			super.onPostExecute(result);
			adapt = new ArrayAdapter<String>(mainContext, android.R.layout.simple_list_item_1, arrayListTitleNews);
			listViewNews.setAdapter(adapt);
		}
	}
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_list_news);	
		listViewNews = (ListView) findViewById(R.id.listView1);
	}
	
	protected void onStart() {
	    super.onStart();
	    MyTask myTask = new MyTask();
	    myTask.execute();
	  }
	
	protected void onDestroy() 
	{
		super.onDestroy();
		unbindService(sConn);
	}
}
Без упомянутых мною циклов while вылетает исключение о нулевом указателе myService. Однако, даже когда эти циклы завершают свою работу, ListView остается пустым(не всегда). Почему myService оказывается пустым? Подскажите, как правильно реализовать задуманное?

disabler92
Сообщения: 2
Зарегистрирован: 03 июл 2014, 02:17

Re: Service. Проблема получения данных из сервиса

Сообщение disabler92 » 10 июл 2014, 03:23

Как я и предполагал на получение сервиса из метода onServiceConnected необходимо некоторое время. Поэтому решением может быть либо выполнение необходимых операций в этом методе, либо организация таких циклов, с помощью которых я и решил данную проблему вначале. В моём случае во втором цикле while лучше проверять жив ли поток, в котором формируется arrayList.

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Service. Проблема получения данных из сервиса

Сообщение altwin » 10 июл 2014, 07:51

disabler92 писал(а):Как я и предполагал на получение сервиса из метода onServiceConnected необходимо некоторое время. Поэтому решением может быть либо выполнение необходимых операций в этом методе, либо организация таких циклов, с помощью которых я и решил данную проблему вначале. В моём случае во втором цикле while лучше проверять жив ли поток, в котором формируется arrayList.
просто сервис предназначен для выполнения дорогостоящих операций в бекграунде, и ждать пока он отработает хоть и можно без всяких циклов с помощью timeout, но это убивает юзабилити и делать так не нужно, логичнее первую загрузку, раз уж она необходима, выполнить асинхтакском показывая индикатор загрузки и далее уже сервисом подгружать кешируя результаты.
Изображение

Ответить