android - How to create RxJava observables to collect smartphone data inside a service and be subscribed in an activity -
context:
i'm trying develop android application gather data many sources such as: battery, hardware, sensors, cell towers, satellites , wifis.
these data has "observed" inside service because need run in background in order log data , send server. when user opens app need show data in activity.
first wrote code using many behaviorsubject
singletons, each representing data source. way pass data service using onnext
method , subscribe anywhere. want rid of subject
objects since recommended usage of observable
.
problems:
i have 2 questions:
question 1: how create rxjava observable
registers listener or broadcastreceiver
@ first subscription and, when subscribers call unsubscribe
method, unregisters listener or receiver?
i have piece of code listen satellites:
private final gpsstatus.listener gpslistener = new gpsstatus.listener() { gpsstatus gpsstatus = null; @override public void ongpsstatuschanged(int event) { gpsstatus = locationmanager.getgpsstatus(gpsstatus); if (event == gpsstatus.gps_event_satellite_status) { if (gpsstatus != null) { //put satellite data in list } } } }; public registersatellite() { locationmanager.addgpsstatuslistener(gpslistener); } public void unregistersatellite() { locationmanager.removegpsstatuslistener(gpslistener); }
i have piece of code listen battery information:
private broadcastreceiver batteryreceiver = new broadcastreceiver() { @override public void onreceive(context context, intent intent) { //put intent data in variable } }; public registerbattery() { context.registerreceiver(batteryreceiver, new intentfilter(intent.action_battery_changed)); } public unregisterbattery() { context.unregisterreceiver(batteryreceiver); }
question 2: in order pass data service activity, singletons option?
you use rxjava's publishsubject. emits subsequent observed items subscriber , supports multiple subscribers:
publishsubject<gpsstatus> subject = publishsubject.create(); // observer1 receive onnext events subject.subscribe(observer1); subject.onnext(<gpsstatus#1>); subject.onnext(<gpsstatus#2>); // observer2 receive gpsstatus #3 subject.subscribe(observer2); subject.onnext(<gpsstatus#3>);
in combination singleton, create sort of bus allows generators (e.g. gpslistener
, broadcastreceiver
) publish activities.
just don't forget unsubscribe ondestroy()
, otherwise you'll leak activities!
Comments
Post a Comment