Pull to refresh

Comments 9

Я решал подобную проблему с помощью LocalBroadcastManager. Вот например тут вкратце описано.

Все сложнее, ежели вам нужно гонять туда-сюда много разных данных своего типа. Кстати, вижу у Message есть поле obj, по идее туда можно что-то свое положить, в документации написано «Objects are reference counted across processes.».

Есть еще AIDL. С его помощью можно передавать любые данные и дергать свои методы + многозадачность.
В поле Message.obj можно передавать любой обьект(класс) который реализует интерфейс Parcelable, аналогично и для AIDL при передачи обьектов. Многие классы Android SDK реализуют данный интерфейс.
Пришлось так, что нужно передавать результат — объект, но вот не могу его модифицировать поддерживать Parcelable. Решение: паттерн Mediator + static reference на объект. Последующий вызов методы Mediator вернел ссылка на объект, а static reference обнулит. Тут только одно, нужно в коде гарантированно вызывать этот метод после запрос сервиса, иначе memory leak.

Ну это так, локальное решение так сказать.
Можно проще. Запускаем Service, все что нужно передаем в него через Intent'ы, которые будут обрабатываться в onStartCommand. В обратном направлении, из Service в Activity посылаем тоже Intent'ы, но через BroadcastReceiver. Надежно, проще, чем с bind, и что важно — без магии!) Мне нравится магия, я люблю магию, но я заметил, что она как собственный пук — нравится только Вам, а окружающие, те кому придется работать с Вашим кодом, ее ненавидят)
Да, есть такой способ, даже на хабре описан и он проще гораздо. Пожалуй — это лучший вариант решения данной задачи. Но андроидеры должны знать о всех доступных способах и моей целью было показать один из них. И второй целью было дополнить существующую доку и в обратную сторону(в сторону активити).
Если сервис — всегда ваш, и работает в том же процессе, что и Activity (подписан тем же ключём) — не нужно вообще ничего городить. Вы можете получить обычную локальную ссылку на объект сервиса и вызвать любые методы этого объекта.
Синглтон? Если нет, то пример в студию! Будет полезно!
в сервисе
public class MyServiceBinder extends Binder {
	MyService getService() {
		return MyService.this;
	}
}
private IBinder binder = new MyServiceBinder();
public IBinder onBind(Intent arg0) {
	return binder;
}

в ServiceConnection внутри Activity
public void onServiceConnected(ComponentName arg0, IBinder arg1) {
	service = ((MyService.MyServiceBinder) arg1).getService();
}

Да, вполне рабочая штука! Тем и люблю андроид, что порой задачу можно решить многими способами:)
Спасибо за пример!
Sign up to leave a comment.

Articles