Android 领域和意图服务
我已经填充了领域数据库。一切正常 应用程序有一个按钮,按下它将启动IntentService。这是非常简单的测试 代码在这里Android 领域和意图服务,android,realm,intentservice,Android,Realm,Intentservice,我已经填充了领域数据库。一切正常 应用程序有一个按钮,按下它将启动IntentService。这是非常简单的测试 代码在这里 public class HNotificationService extends IntentService { public HNotificationService() { super("HNotificationService"); } @Override protected void onHandleIntent
public class HNotificationService extends IntentService {
public HNotificationService() {
super("HNotificationService");
}
@Override
protected void onHandleIntent(Intent intent) {
Log.d("HNotificationService", "onHandleIntent");
Realm realm = Realm.getDefaultInstance();
RealmResults<HPartner> mResPartner = realm.where(HPartner.class).findAll();
final HPartner hPartner = mResPartner.get(0);
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
hPartner.setName("test");
}
});
realm.close();
}
}
EDIT2
是的,你是对的,数据库没有被删除
Log.e(“HNotificationService”,“empty”)代码>-它从不被调用,这很好
Realm realm = Realm.getDefaultInstance();
RealmResults<HPartner> mResPartner = realm.where(HPartner.class).findAll();
if (mResPartner.size() > 0) {
Log.e("HNotificationService", "don't empty!");
}
final HPartner hPartner = mResPartner.get(0);
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
hPartner.setName("test");
}
});
mResPartner = realm.where(HPartner.class).findAll();
if (mResPartner.size() == 0) {
Log.e("HNotificationService", "empty");
}
realm.removeAllChangeListeners();
realm.close();
而且从来没有人叫过mPartnersListener。这很奇怪。
如果不运行IntentService。mPartnersListener总是打电话来
编辑3
mPartnersListener = new RealmChangeListener<RealmResults<HPartner>>() {
@Override
public void onChange(RealmResults<HPartner> realmResult) {
mResPartners.removeChangeListeners();
mClusterManager.clearItems();
mGoogleMap.clear();
if (realmResult != null && realmResult.size() > 0) {
mListPartners = realmResult;
getLoaderManager().restartLoader(LMarkerIcons.ID_LOADER, null, FrAroundMeMap.this);
}
}
};
mPartnersListener=newrealmchangeslistener(){
@凌驾
更改后的公共void(RealmResults realmResult){
mResPartners.removeChangeListeners();
mClusterManager.clearItems();
mGoogleMap.clear();
if(realmResult!=null&&realmResult.size()>0){
mListPartners=realmResult;
getLoaderManager().restartLoader(LMarkerIcons.ID_LOADER,null,FrAroundMeMap.this);
}
}
};
我想,我找到了问题所在!在本部分中记录日志之后,可以删除IntentService中的所有ChangeListeners
mResPartner = realm.where(HPartner.class).findAll();
if (mResPartner.size() == 0) {
Log.e("HNotificationService", "empty");
}
realm.removeAllChangeListeners();
realm.close();
然后你们做新的查询,添加新的changeListener,希望从他那个里得到通知,但在发送通知之后,上面的代码删除了侦听器
将changelistener添加到异步获取的realmResult-正确,应该可以正常工作!
因此,请在IntentDevice中删除此块
realm.removeAllChangeListeners();
你的听众看起来也很奇怪,看看你的表情吧
mPartnersListener=newrealmchangeslistener(){
@凌驾
更改后的公共void(RealmResults realmResult){
//在这里,你可以在做你的事情之前删除监听器,然后
//onChange再也不会被调用了
//如果你把日志放在这里,你会发现,那个监听器被调用了
//简单删除块->mResPartners.removeChangeListeners();
mResPartners.removeChangeListeners();
mClusterManager.clearItems();
mGoogleMap.clear();
if(realmResult!=null&&realmResult.size()>0){
mListPartners=realmResult;
getLoaderManager().restartLoader(LMarkerIcons.ID_LOADER,null,FrAroundMeMap.this);
}
}
};
我想,我找到了问题所在!在本部分中记录日志之后,可以删除IntentService中的所有ChangeListeners
mResPartner = realm.where(HPartner.class).findAll();
if (mResPartner.size() == 0) {
Log.e("HNotificationService", "empty");
}
realm.removeAllChangeListeners();
realm.close();
然后你们做新的查询,添加新的changeListener,希望从他那个里得到通知,但在发送通知之后,上面的代码删除了侦听器
将changelistener添加到异步获取的realmResult-正确,应该可以正常工作!
因此,请在IntentDevice中删除此块
realm.removeAllChangeListeners();
你的听众看起来也很奇怪,看看你的表情吧
mPartnersListener=newrealmchangeslistener(){
@凌驾
更改后的公共void(RealmResults realmResult){
//在这里,你可以在做你的事情之前删除监听器,然后
//onChange再也不会被调用了
//如果你把日志放在这里,你会发现,那个监听器被调用了
//简单删除块->mResPartners.removeChangeListeners();
mResPartners.removeChangeListeners();
mClusterManager.clearItems();
mGoogleMap.clear();
if(realmResult!=null&&realmResult.size()>0){
mListPartners=realmResult;
getLoaderManager().restartLoader(LMarkerIcons.ID_LOADER,null,FrAroundMeMap.this);
}
}
};
在这段代码中让我感到困扰的是,您应该在事务中获取领域对象的最新版本
@Override
protected void onHandleIntent(Intent intent) {
Log.d("HNotificationService", "onHandleIntent");
Realm realm = Realm.getDefaultInstance();
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
RealmResults<HPartner> mResPartner = realm.where(HPartner.class).findAll();
final HPartner hPartner = mResPartner.get(0);
hPartner.setName("test");
}
});
realm.close();
}
还值得注意的是,Realm.getDefaultInstance()。其中(
此构造意味着您永远无法关闭UI线程上的领域
编辑:你确定吗
mResPartners.removeChangeListeners();
在您的更改侦听器中没有引起任何问题吗?在这段代码中,让我感到困扰的是您应该在事务中获取域对象的最新版本
@Override
protected void onHandleIntent(Intent intent) {
Log.d("HNotificationService", "onHandleIntent");
Realm realm = Realm.getDefaultInstance();
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
RealmResults<HPartner> mResPartner = realm.where(HPartner.class).findAll();
final HPartner hPartner = mResPartner.get(0);
hPartner.setName("test");
}
});
realm.close();
}
还值得注意的是,Realm.getDefaultInstance()。其中(
此构造意味着您永远无法关闭UI线程上的领域
编辑:你确定吗
mResPartners.removeChangeListeners();
您的更改侦听器中没有出现任何问题?这看起来很正常。您的域配置是什么?在执行该代码后,如何检测域为空?您确定要先将HPartner添加到DB吗?realm.executeTransaction保留机制以捕获发生的验证并取消事务。若要找出问题,您可以使用记录。检查HPartner表的大小等等,记录每一步。你如何知道你的数据库变空了?@Christian Melchior请查看edit2@VladymyrR.tmnko请参阅edit2这看起来很正常。您的域配置是什么?执行该代码后如何检测域为空?您确定要先将HPartner添加到DB吗?realm.executeTransaction keep机制用于捕获发生的Exeption并取消事务。若要找出问题,您可以使用loggin。检查HPartner表的大小等,记录每个步骤。您如何知道您的DB变为空?@Christian Melchior请参阅edit2@VladymyrR.tmnko请参阅edit2您不必获取最新版本的事务中的realm对象!事务必须包含代码,以某种方式修改DB数据,并尽可能快地提交!FindalAsync-我稍后调用。这里是ChangeListener的问题,他们在IntentService之后没有调用它。这很奇怪!!!你试过我说的吗?我喜欢这个问题。如果我使用Service-ChangeListener工作正常。如果我使用IntentService-ChangeListener Breaked!!!IntentService-它有一个单独的线程。我认为这是问题的原因在单独的线程上不应该是问题,但我确实想知道与IntentService自己的线程相关联的循环器和处理程序是否是问题。您不必获取最新版本的