我有一个Android小部件,即使应用程序被杀死也必须更新。所以我有一个Android服务来处理这个工作。
如果更新数据库中的数据,则更新窗口小部件ui。此数据可能会被其他触发器更新。我使用数据库值中的Observable映射了widget ui update。
数据库是Paper https://github.com/pilgr/Paper,我用它来处理它RxJava2包装器https://github.com/pakoito/RxPaper2。
以下是该服务的简化代码。
public class WidgetService extends Service {
private CompositeDisposable mCompositeDisposable = new CompositeDisposable();
private WidgetMager mWidgetManager = new WidgetManager();
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
reactOnNotification();
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
super.onDestroy();
AppLog.v(this, "Destroy service.");
clearSubscriptions();
}
private void reactOnNotification() {
mCompositeDisposable.add(
RxPaperBook
.with("RT")
.observe("SINGLE", RTAQI.class, BackpressureStrategy.LATEST)
.toObservable()
.doOnNext(value -> mWidgetManager.update(value))
.subscribeWith(new GenericSubscriber2<>("Notif"))
);
mCompositeDisposable.add(
Observable
.interval(1, TimeUnit.SECONDS)
.map(aLong -> (RTAQI) Paper.book("RT").read("SINGLE"))
.doOnNext(value -> mWidgetManager.update(value))
.subscribeWith(new GenericSubscriber2<>("Pulling"))
);
}
private void clearSubscriptions() {
if (mCompositeDisposable != null) {
mCompositeDisposable.clear();
}
mCompositeDisposable = new CompositeDisposable();
}
}
widgetManager使用远程视图更新小部件。
对于该示例,我只放了2个小部件更新机制:
我预计会遇到subscribeOn的问题,我真的不知道如何在服务中处理这个问题。欢迎任何帮助。