2016-11-21 90 views
-1

我在每个位置更改侦听器的LocationService类中编写realm db,并在Activity中列出此更改以更新UI。最初它工作正常,但是当realm db中的条目数量超过2K时,它会开始阻止UI。任何人都请建议。从导致UI块的服务类中编写领域

+2

*请人建议* ...好像你需要改变你的代码... – Selvin

+0

喔,谢谢Selvin ...而不是简单地降如果你知道一些事情,你应该给我一个想法。我不想为此使用IntentService。 – Vid

+2

反而咆哮,你应该提供你的代码...大多数程序员不使用魔法球,所以没有代码很难说什么是问题... – Selvin

回答

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); 
+0

谢谢亚历克斯,你是对的。然而,我的老板让我不要使用IntentService :-(。 – Vid

+3

然后创建普通服务,将位置更新回调绑定到PublishSubject ,订阅它,并将其保存到后台线程领域 –

+0

我已更新回答 –