首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓,领域:为什么方法isClosed()返回false?

安卓,领域:为什么方法isClosed()返回false?
EN

Stack Overflow用户
提问于 2017-08-17 07:22:35
回答 1查看 366关注 0票数 0

领域3.5.0

我在MyApp中添加了领域。

这里的片段:

代码语言:javascript
复制
public class MainApp extends MultiDexApplication {    
    private void setRealmDefaultSyncConfiguration(SyncUser syncUser, String realmURL) {
        SyncConfiguration sync = new SyncConfiguration.Builder(syncUser, realmURL).build();
            Realm.setDefaultConfiguration(sync );
            if (BuildConfig.DEBUG)
                Log.d(TAG, "setRealmDefaultSyncConfiguration: SUCCESS SET REALM DEFAULT CONFIGURATION:"
                        + "\nThreadSignature = " + AndroidUtil.getThreadSignature()
                        + "\nsyncUser = " + syncUser
                        + "\nrealmURL = " + realmURL
                        + "\nRealm = " + Realm.getDefaultInstance()
                        + "\nRealmget. DefaultConfiguration:\n\n" + Realm.getDefaultInstance().getConfiguration() + "\n\n"
                );
    }
}

下面是logcat数据:

代码语言:javascript
复制
 setRealmDefaultSyncConfiguration: SUCCESS SET REALM DEFAULT CONFIGURATION:
 Thread=main: id=1, priority=5, group=main
 syncUser = {UserId: 32afeeeeeeeeeeeeeeee3c63f5606c4b, AuthUrl: http://172.12.11.90:9080/auth, IsValid: true, Sessions: 0}
 realmURL = realm://172.12.11.90:9080/fccc46ssssssssssssssssb9e828700c/db
 Realm = io.realm.Realm@4225bd68
 Realmget. DefaultConfiguration:  
 realmDirectory: /data/data/com.myproject/files/realm-object-server/32afeeeee/fccc46bbe2354bae35d3ddb9e828700c
 realmFileName : db
 canonicalPath: /data/data/com.myproject/files/realm-object-server/32afeeeee3f5606c4b/fccc46ssssssssssssssssb9e828700c/db
 key: [length: 0]
 schemaVersion: 0
 migration: null
 deleteRealmIfMigrationNeeded: false
 durability: FULL
 schemaMediator: io.realm.DefaultRealmModuleMediator@42136c40
 readOnly: false
 compactOnLaunch: null
 serverUrl: realm://172.12.11.90:9080/fccc46ssssssssssssssssb9e828700c/db
 user: {UserId: 32afeeeeeeeeeeeeeeee3c63f5606c4b,
 AuthUrl: http://172.12.11.90:9080/auth, IsValid: true, Sessions: 0}
 errorHandler: io.realm.SyncManager$1@42068038
 deleteRealmOnLogout: false
 waitForInitialRemoteData: true

正如您可以在“主”线程上的create中看到的那样。

PersonFragment代码:

代码语言:javascript
复制
public class PersonsFragment extends Fragment {
    private Realm realm;

    @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.organizations_fragment, container, false);
            realm = Realm.getDefaultInstance();
            return rootView;
        }        

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (BuildConfig.DEBUG)
            Log.d(TAG, "onDestroy():"
                    + "\nThreadSignature=" + AndroidUtil.getThreadSignature()
                    + "\nRealm global instance=" + Realm.getGlobalInstanceCount(Realm.getDefaultConfiguration())
                    + "\nrealm=" + realm);
        realm.close();
        if (BuildConfig.DEBUG)
            Log.d(TAG, "onDestroy():"
                    + "\nThreadSignature=" + AndroidUtil.getThreadSignature()
                    + "\nrealm.isClosed()=" + realm.isClosed()
                    + "\nRealm global instance=" + Realm.getGlobalInstanceCount(Realm.getDefaultConfiguration())
            );
    }
}

我的碎片的逻辑猫:

代码语言:javascript
复制
PersonsFragment(18573):onDestroy():
PersonsFragment(18573):Thread=main:id=1,priority=5,group=main
PersonsFragment(18573):Realm global instance = 1
PersonsFragment(18573):realm = io.realm.Realm@4225bd68  
PersonsFragment(18573):onDestroy():
PersonsFragment(18573):Thread=main:id=1,priority=5,group=main
PersonsFragment(18573):realm.isClosed() = false
PersonsFragment(18573):Realm global instance = 1

如您所见,isClose()仍然是false,而领域全局实例总是= 1,而且领域实例是在线程上创建的。

EN

回答 1

Stack Overflow用户

发布于 2017-08-17 07:41:36

更新我刚刚发现了这个问题这里

或者你可以跟着这个-

你可以试试这个,从这个问题中学到的东西。您可能打开了多个领域实例,在不同的线程上,您可以尝试使用下面的代码关闭onDestroy()中的每个领域实例-

代码语言:javascript
复制
while(!realm.isClosed()) realm.close();

然后检查isClosed()是否返回true。

另外,要以更好的方式处理不同线程上的领域实例,可以遵循@Zhuinden的方法-

代码语言:javascript
复制
try(Realm realm = Realm.getDefaultInstance()) {
   // use realm
} // auto-close

或者关闭finally块中的领域实例。

如果你还需要帮助,请告诉我。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45728917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档