基于 Observable 的 API 和取消订阅问题

2024-03-29

我正在尝试使用 Rx-Java 创建一个用于 Android 上位置跟踪的类。我仍然不知道如何正确处理我的 Observable 的生命周期。我想要的是一个 Observable,它在第一次订阅发生时开始跟踪位置,并在最后一次订阅被丢弃时停止位置跟踪。到目前为止我所取得的成就是:

public class LocationObservable 
    implements GooglePlayServicesClient.ConnectionCallbacks, 
               GooglePlayServicesClient.OnConnectionFailedListener, 
               LocationListener {

    private LocationClient locationClient;
    private final PublishSubject<Location> latestLocation = 
        PublishSubject.create();
    public final Observable<Location> locationObservable = 
        Observable.defer(() -> {
        if(!locationClient.isConnected() && !locationClient.isConnecting()) {
            locationClient.connect();
        }
        return latestLocation.asObservable().scan((prev, curr) -> {
            if (Math.abs(prev.getLatitude() - curr.getLatitude()) > 0.000001 ||
                Math.abs(prev.getLongitude() - curr.getLongitude()) > 0.000001)
                return curr;
            else
                return prev;
        }).distinctUntilChanged();});

    public LocationObservable(Context context) {

        locationClient = new LocationClient(context, this, this);
    }

    @Override
    public void onConnected(Bundle bundle) {
        latestLocation.onNext(locationClient.getLastLocation());
    }

    @Override
    public void onDisconnected() {
        latestLocation.onCompleted();
    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        latestLocation.onError(new Exception(connectionResult.toString()));
    }

    @Override
    public void onLocationChanged(Location location) {
        latestLocation.onNext(location);
    }
}

正如你所看到的,我使用Observable#defer当第一个客户端订阅时初始化位置回调。我不知道这是否是一个好方法,但这是我目前想到的最好的方法。我仍然缺少的是当我的班级的最后一个客户取消订阅我的可观察对象时如何停止位置更新。或者也许这是 Rx 中不惯用的东西,因为它并不明显?

我相信,这个用例应该相当标准,因此应该有一个标准/惯用的解决方案。很高兴知道这一点。


private LocationClient locationClient;
private final Observable<Integer> locationObservable = Observable
        .create(new OnSubscribe<Integer>() {

            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                locationClient.connect();
                subscriber.add(Subscriptions.create(new Action0() {

                    @Override
                    public void call() {
                        if (locationClient.isConnected()
                                || locationClient.isConnecting()) {
                            locationClient.disconnect();
                        }
                    }

                }));
            }

        }).multicast(PublishSubject.<Integer> create()).refCount();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于 Observable 的 API 和取消订阅问题 的相关文章

  • Android:如何将自定义字段/操作添加到联系人详细信息

    我会将自定义操作添加到 Android 的系统联系方式中 例如 Viber 请参阅随附的屏幕截图 和其他消息应用程序 当用户单击此类自定义操作时 我的应用程序将进行处理 有什么帮助吗 我怀疑这是否像听起来那么容易 据我所知 您需要在设备上创
  • 如何查看 Android 设备上安装的 SD 卡还有多少可用空间?

    如何以编程方式检查 Android 设备上安装的 SD 卡有多少可用空间 要获取外部 SD 卡的可用 可用 空间以显示与菜单 gt 设置 gt SD 卡和手机存储的编号一致的编号 请使用以下代码 StatFs stat new StatFs
  • 在 CollapsingToolbarLayout 中设置 minHeight 没有任何效果

    我目前使用 CollapsingToolbarLayout 遇到的主要问题是 无论我尝试什么 工具栏的 minHeight 属性都没有任何效果 我想要的结果是这样的 CollapsingToolbarLayout 具有一定的展开高度和一定的
  • RecyclerView.OnScrollListener:一次滚动实例被多次调用

    我有一个水平布局的回收视图 一次只有一个视图可见 mRecyclerView findViewById R id rvmain mRecyclerView setOnFlingListener null final SnapHelper s
  • 如何在datepickerdialog android中选择年份?

    我是 Android 编程新手 请帮忙 我正在使用创建材料设计的片段DatePickerDialog点击EditText 问题是它设置为当前日期 由我设置 但是 如果用户必须选择过去的日期 比如说 10 年前 用户必须每月滚动 这是痛苦的
  • 我应该保留远程数据库的本地副本吗?

    我正在开发一个应用程序 基本上允许人们创建 加入和管理其他人的群组 群组内的人也可以互相发送消息 我一直在想哪条路会更好 保留包含所有信息的远程数据库 包括发送给用户和从用户发送的消息 并让应用程序在每次需要信息时查询服务器 甚至是它以前见
  • 无法在 Android 模拟器上使用 ART

    我只是想在我的模拟器上尝试 android 4 4 的 ART 我所做的是创建一个模拟器 选择设备为 Nexus 7 目标为 Android 4 4 RAM 512 然后我启动模拟器并加载它 然后我进入开发者选项并选择运行时作为 ART 设
  • Galaxy Nexus 4.1.1 和 ISO14443 读卡器

    是否可以在 Galaxy Nexus Jelly Bean 4 1 1 移动设备和任何常规桌面非接触式读卡器 ISO 14443 A B 之间建立连接 据我所知 android不支持卡模拟模式 所以只能通过p2p模式来完成 p2p 是否基于
  • 推送通知需要很长时间才能到达

    我在适用于 iOS 和 Android 的 Adob e Air 应用程序中遇到推送通知的奇怪问题 我正在使用 Milkman Games 的 Easy Push ANE 以及 One Signal 服务 问题是通知确实会到达 但有时 随机
  • Oreo(API 26)-drawOverlay + 在状态栏上绘制

    在android oreo中 我无法使用WindowManager LayoutParams TYPE SYSTEM ERROR不再需要并且必须使用WindowManager LayoutParams TYPE APPLICATION OV
  • 在Android中绘制圆角矩形

    我已经发现这个问题 https stackoverflow com questions 5618402 how to draw rounded rectangle in android ui解决方案是这段代码
  • 如何在Android data/data/project文件系统中创建文件目录和文件夹

    我正在开发一个视频编辑器程序 并且对 android 和 java 相当陌生 我希望发生的是 当用户按下 创建新项目 按钮时 会弹出一个对话框 询问用户项目的名称 我已经把那部分写下来了 但是我想要的是 当用户在该对话框上按 确定 时 我的
  • setKeyListener 将覆盖 setInputType 并更改键盘

    大家好 我在两个设备之间遇到问题 在实践中使用InputType和KeyListener我正在操纵一个EditText让它从数字键盘接收逗号和数字 有关更多背景信息 请检查我之前的question https stackoverflow c
  • 将 espresso 与自定义 EditText 结合使用

    这是我的布局的一部分
  • DialogFragment在Android中的位置

    我有一个DialogFragment显示一个View就像弹出屏幕一样 窗口始终出现在屏幕中间 有没有办法设置位置DialogFragment窗户 我已经查看了但还没有找到任何东西 尝试这样的事情 Override public View o
  • Listview里面只有一个Element

    您好 我正在尝试将列表视图放入列表视图中的列表视图中 唯一的问题是只有第一个列表视图正确显示所有元素 此后的每个列表视图仅包含一个元素 UPDATE 创建我自己的不可滚动列表视图解决了这个问题 https stackoverflow com
  • 如何从耳机插孔获取电力?

    我的问题是是否有人知道如何创建一个可以通过设备的耳机插孔发送电荷的 Android 应用程序 就像这个视频中那样 该视频展示了一款 iPhone 应用程序 可控制插入耳机插孔的 LED 我想知道如何访问该设备来发送电信号 抱歉我的英语不是我
  • C/C++ 通过 Android NDK 在 JNI 中看不到 Java 方法

    我正在尝试从使用 NDK 构建的 C 类文件调用 Java 方法 它不断抛出常见的 未找到非静态方法 错误并导致整个 Android 应用程序崩溃 下面的代码片段 有些东西可能不需要 但我按原样保留它们 因为焦点 问题在于refreshJN
  • 我可以在 Android Market 上出售我的 SL4A 应用程序吗?

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想使用 SL4A 在 Android 上使用 Python 开发一个应用程序 并且我想知道是否可以将其作为应用程序在 Android Market
  • 有什么方法可以禁用/覆盖 Galaxy Tab 4 上的多任务按钮吗? [复制]

    这个问题在这里已经有答案了 我们编写了一个工业控制应用程序 并随我们的制造产品预装在三星 Galaxy 平板电脑上 我们使用的平板电脑是运行 Honeycomb 的 Tab 10 但我们无法再获得足够的 OEM 平板电脑 因此我们改用运行

随机推荐

  • 将 log4net 与 WebApi 结合使用 - 在整个实例中保持相同的相关 ID

    我有一个 LoggingHandler 类 用作消息处理程序来记录 使用 log4net 请求和对我的 WebApi 的响应 public class LoggingMessageHandler DelegatingHandler publ
  • 在 Google 日历中设置事件颜色

    使用谷歌日历API http code google com apis calendar 我可以成功add http code google com apis calendar data 2 0 developers guide dotne
  • Dealloc 被调用两次?

    解决 感谢孤独枪手 这个问题是由于在释放许多代表之前没有将其设置为零而造成的 这是一个奇怪的 我熟悉基本的内存管理 但我认为我所看到的有些不寻常 这是一些背景 我有一个 NavigationController 来处理以下 ViewCont
  • “Binding”类型的 DependencyProperty 未更新

    我在创建 Binding 类型的 DependencyProperty 时遇到问题 其他类型工作正常 如果我使用绑定填充它们 它们就会成功解析 在我的场景中 我想获取原始绑定 以便我可以使用它来绑定到子对象的属性 这与 DataGrid 处
  • 相对于视图的CGPoint

    考虑一个屏幕点 CGPoint 和一个视图 UIView 它位于视图层次结构内部的某个位置 它可以是其他视图的子视图 如何将点转换为相对于视图坐标的点 首先 将该点从屏幕坐标转换为主窗口的坐标 UIWindow mainWindow UIA
  • 分配新值后将 ObservableCollection 绑定到 DataGrid

    这似乎是一个简单的问题 但我无法让它发挥作用 我有一个具有以下属性的用户控件 public ObservableCollection
  • 仅当 IP 地址获得批准时才允许用户访问页面

    如何制作一个 HTML 和 CSS PHP JavaScript 文档 只允许页面上的某些 IP 地址 我不是问 how 使用 PHP 查找 IP 地址 但如何允许基于 IP 地址访问页面 把它放在你的 php 文件的顶部并更新allowe
  • 用于创建断开连接的数据库应用程序的最佳基于 .NET3.5 的策略

    我的要求是 相对较小的数据库 25 30 个表 每个表有 4 5k 行 4 5 个用户在其笔记本电脑上拥有自己的本地数据库副本 在需要时或一天结束时进行同步 免费解决方案 正如我为 NFP 组织进行的设置一样 过去几天我一直在研究各种选择
  • 如何调试肉桂小程序?

    我想写一个肉桂小程序 这些都是基于 JavaScript 的 我希望编写的代码更改服务 打开和关闭它们 类似于WebDeveloper菜单小程序 https bitbucket org infiniteshroom cinnamon web
  • 仅保留 git 中文件子集的提交

    我想实现以下目标 保留我选择的文件的所有更改历史记录 或提交 有些文件被重命名 有些文件也从其他目录移动 我想删除与我从 git 日志中选择的文件无关的所有提交 我尝试了不同的方法 例如this https medium com ayush
  • 如何通过http打开远程sqlite数据库?

    是否可以通过 http 打开 sqlite 文件 我只需要读取数据库 并希望我可以做类似的事情 var dbFile File new File http 10 1 1 50 project db sqlite sqlConnection
  • Angular View 绑定未使用简单布尔值更新

    再见 这可能是一个菜鸟问题 但我无法让它发挥作用 我有一个简单的服务 可以切换布尔值 如果布尔值为 true 则活动类应该出现在我的 div 上 如果为 false 则没有类 就这么简单 但是布尔值已更新 但我的视图没有对此做出反应 我是否
  • if match 语句中的 #N/A 返回 FALSE

    如果出现匹配错误 我会尝试显示 FALSE 值 现在 我还无法弄清楚 我对谷歌电子表格中的公式如何工作仍然很陌生 IF MATCH A16 W46 W52 0 TRUE FALSE 如果该值存在 则当前有效 我努力了 IF ISNA MAT
  • 大于/小于的 switch 语句

    所以我想使用这样的 switch 语句 switch scrollLeft case lt 1000 do stuff break case gt 1000 lt 2000 do stuff break 现在我知道这些陈述中的任何一个 lt
  • 如何找到多维数组的 .index

    尝试了网络资源 但没有任何运气和我的视觉快速入门指南 如果我有二维 多维数组 array x x x x x S x x x x x print array index S it returns nil 然后我去输入 array x S x
  • Facebook PHP SDK - 无法正确注销

    我花了几个小时寻找这个问题的解决方案 但找不到适合我的解决方案 当我在网站上单击 注销 时 用户信息仍然可见 并且仍然显示注销按钮 这是代码 require facebook php sdk src facebook php faceboo
  • Netlify 重定向不起作用 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 所以昨天我遇到了问题 因为我无法对 GitHub 页面上托管的页面实施 301 重定向 今天我发现 Netlify 应该
  • 为什么我不能在 build() 中使用 context.read,但可以将 Provider.of 与 Listen: false 一起使用?

    文档中指出这些是相同的 并且context read只是一个捷径Provider of
  • 无法将 openlayers-3 与 webpack 一起使用

    我必须将 openlayers 包含在我正在开发的项目中 我已经尝试过将其包含在ext文件夹和 npm 我在我的工作流程中使用 Webpack 编译时 我在控制台中收到以下警告 WARNING in openlayers dist ol j
  • 基于 Observable 的 API 和取消订阅问题

    我正在尝试使用 Rx Java 创建一个用于 Android 上位置跟踪的类 我仍然不知道如何正确处理我的 Observable 的生命周期 我想要的是一个 Observable 它在第一次订阅发生时开始跟踪位置 并在最后一次订阅被丢弃时停