Android 领域和意图服务

Android 领域和意图服务,android,realm,intentservice,Android,Realm,Intentservice,我已经填充了领域数据库。一切正常 应用程序有一个按钮,按下它将启动IntentService。这是非常简单的测试 代码在这里 public class HNotificationService extends IntentService { public HNotificationService() { super("HNotificationService"); } @Override protected void onHandleIntent

我已经填充了领域数据库。一切正常

应用程序有一个按钮,按下它将启动IntentService。这是非常简单的测试

代码在这里

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自己的线程相关联的循环器和处理程序是否是问题。您不必获取最新版本的