Service. Проблема получения данных из сервиса
Добавлено: 03 июл 2014, 03:20
Здравствуйте.
В общем так. Есть две активити и сервис. На первой активити имеется кнопка, по нажатию на которую запускается вторая активити. Вторая активити содержит ListView, который содержит то, что загружает сервис из интернета. Сервис стартует вместе с созданием первой активити и сразу начинает работу. Загрузка содержимого из инета и формирование ArrayList'а для ListView занимает у сервиса N-е количество времени. Проблема: если после старта сервиса нажать на кнопку в первой активити раньше, чем пройдет N-e количество времени(сервис не успеет сформировать ArrayList), то вылетит исключение. Попробовал использовать AsynсTask, но работает через раз, да и то, пришлось писать костыльные циклы while.
Без упомянутых мною циклов while вылетает исключение о нулевом указателе myService. Однако, даже когда эти циклы завершают свою работу, ListView остается пустым(не всегда). Почему myService оказывается пустым? Подскажите, как правильно реализовать задуманное?
В общем так. Есть две активити и сервис. На первой активити имеется кнопка, по нажатию на которую запускается вторая активити. Вторая активити содержит 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);
}
}