Циклическое обновление данных с REST сервиса в фоне (dataDroid)?

По примеру из статьи Написание простого приложения для работы с RESTful..., реализовал свое приложение, которое запрашивает новости и сохраняет время последнего обновления


Никак не могу добиться обновления данных через заданный промежуток времени в фоне.

По советам на Stack Overflow использую Alarm Manager прямо из Operation

request.put("id", user_id);
		request.put(Tweets.CREATED,
				prefs.getString(user_id + "_" + Tweets.CREATED, ""));

		Intent intent = new Intent(context, RestService.class);
		intent.putExtra(RestService.INTENT_EXTRA_REQUEST, request);

		PendingIntent pendingIntent = PendingIntent.getService(context, 0,
				intent, 0);

		AlarmManager am = (AlarmManager) context
				.getSystemService(Context.ALARM_SERVICE);

		am.cancel(pendingIntent);

		long interval = 1000 * 60 * Integer.parseInt(prefs.getString("interval", "5"));

		am.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime()
				+ interval, pendingIntent);


^ проблема в том что am.cancel не срабатывает (ведь Intent то уже другой) и в результате получать одно и тоже сообщение можно бесконечно.


В ходе своих изысканий понял что нужно по таймеру выполнять метод update из MainActivity

void update() {

		listView.setRefreshing();

		if (!user_id.equals("0")) {

			Request updateRequest = new Request(RequestFactory.REQUEST_TWEETS);

			updateRequest.put("method", "projects.feed");
			updateRequest.put("id", user_id);
			updateRequest.put(Tweets.CREATED,
					prefs.getString(user_id + "_" + Tweets.CREATED, ""));

			requestManager.execute(updateRequest, requestListener);
		} else {
			listView.onRefreshComplete();
		}
	}



но разве так можно? А если и можно то как этого достичь?
  • Вопрос задан
  • 4849 просмотров
Решения вопроса 1
Gariks
@Gariks Автор вопроса
Решил проблему в лоб. Создал еще один IntentService сервис с независимым от MainActivity классом requestListener
	@Override
	protected void onHandleIntent(Intent arg0) {
				
		String user_id=prefs.getString("user_id", "0");
		Request updateRequest = new Request(RequestFactory.REQUEST_TWEETS);

		updateRequest.put("method", "projects.feed");
		updateRequest.put("id", user_id);
		updateRequest.put(Tweets.CREATED,
				prefs.getString(user_id + "_" + Tweets.CREATED, ""));
		
		requestManager.execute(updateRequest, requestListener);
	}


и таймер в MainActivity, который перезагружается на onStart либо после ручного обновления списка.
	void startTimer() {
		Intent intent = new Intent(context, TestService.class);
		PendingIntent pendingIntent = PendingIntent.getService(context, 0,
				intent, 0);
		AlarmManager am = (AlarmManager) context
				.getSystemService(Context.ALARM_SERVICE);
		
		am.cancel(pendingIntent);
		
		long interval_=1000 * 60 * Integer.parseInt(interval);

		am.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime()
				+ interval_, interval_, pendingIntent);
	}


Соответственно если в будущем придется добавлять функционал можно передавать extras сервису, а в нем самом уже, например фабрику запросов.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Collosteam
@Collosteam
Android кодирую
Правильней испольовать Sync Adapter
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы