【问题标题】:Writing realm from service class causing UI block从服务类写入领域导致 UI 阻塞
【发布时间】:2016-11-21 10:15:09
【问题描述】:

我在每个位置更改侦听器上从我的 LocationService 类编写领域数据库,并在 Activity 中列出此更改以更新 UI。最初它工作正常,但是当领域 db 中的条目数超过 2K 时,它开始阻塞 UI。请任何人提出建议。

【问题讨论】:

  • 请任何人提出建议。 ...似乎您需要更改代码...
  • 哦,谢谢 Selvin... 而不是简单地投反对票,如果你知道的话,你应该给我一个想法。我不想为此使用 IntentService。
  • 与其咆哮你应该提供你的代码......大多数程序员没有使用魔法球,所以没有代码很难说问题是什么......

标签: java android service location realm


【解决方案1】:

是的,问题是服务在 MainThread(默认为 UI 线程)中运行。您需要在后台线程上异步写入数据。请注意,Realm 实例是线程相关的,它必须在单个写入事务中被忽略和释放。 考虑使用 IntentService - 默认情况下它有后台线程,或者,使用 rxJava 库来组织后台作业 - 这是最简单的方法。 这是如何完成的代码:

PublishSubject<Location> locationSource = PublishSubject.create();

        // bind to location source for receiving locations
        Observable<Integer> saveToDbTask =
        locationSource.asObservable()
                // this line switches execution into background thread from embedded thread pool
                .observeOn(Schedulers.computation())
                .map(location -> {
                    int result -> saveLocationToDb(location);
                    return result;
                });

        // subscribe to that task when you start
        Subscription subscription = saveToDbTask.subscribe(t -> {
            Log.i(LOG_TAG, "Result: " + t);
        });

        // unsubscribe when it is no longer needed
        if (null != subscription && !subscription.isUnsubscribed()){
            subscription.unsubscribe();
            subscription = null;
        }

        // tunnel location from your FusedLocationApi's callback to pipeline:
        Location loc = new Location(..);
        locationSource.onNext(loc);

【讨论】:

  • 谢谢你,亚历克斯,你是对的。但是,我的老板让我不要使用 IntentService :-(.
  • 然后创建普通Service,绑定位置更新回调到PublishSubject,订阅它,保存到后台线程的realm中
  • 谢谢亚历克斯!我会试试这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
相关资源
最近更新 更多