我在Google CE上设置了Realm Object Server。在我的Android客户端中,我使用Firebase登录,从中我获取令牌。当然,我将此令牌转发给ROS以自行对Firebase进行身份验证。这个流程中的所有内容似乎都在工作,因为Realm登录不会失败并返回我用来创建SyncConfiguration的SyncUser。此外,我可以看到新的Realm出现在我的ROS网站管理员中。
问题是,我使用Realm.getInstance(syncConfiguration)
创建的任何数据都不存储在服务器上。我想是的,因为如果我创建一些数据,重新安装应用程序然后重新进行身份验证,我的同步域就是空的。
但是,在打开RealmLog
的调试日志后,我注意到了一件很重要的事情。这就是以下堆栈跟踪:
D/REALM_JAVA: AuthenticateResponse - Error: UNKNOWN(-1)
java.io.InterruptedIOException: thread interrupted
at okio.Timeout.throwIfReached(Timeout.java:146)
at okio.Okio$1.write(Okio.java:75)
at okio.AsyncTimeout$1.write(AsyncTimeout.java:180)
at okio.RealBufferedSink.flush(RealBufferedSink.java:216)
at okhttp3.internal.http.Http1xStream.finishRequest(Http1xStream.java:161)
at okhttp3.internal.http.CallServerInterceptor.intercept(CallServerInterceptor.java:51)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:45)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:109)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:124)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:170)
at okhttp3.RealCall.execute(RealCall.java:60)
at io.realm.internal.network.OkHttpAuthenticationServer.authenticate(OkHttpAuthenticationServer.java:110)
at io.realm.internal.network.OkHttpAuthenticationServer.loginToRealm(OkHttpAuthenticationServer.java:63)
at io.realm.SyncSession$2.execute(SyncSession.java:225)
at io.realm.SyncSession$2.execute(SyncSession.java:221)
at io.realm.internal.network.ExponentialBackoffTask.run(ExponentialBackoffTask.java:66)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)
我不知道为什么会发生这种情况,但我会说它与Realm实例的生命周期有关。具体地说,我的Realm实例通常是短暂的。在我的应用程序中,Realm是一个实现细节,所以我尽量保持它的深度。当我想查询数据时,我打开Realm实例,选择RealmObjects,将它们映射到我的业务逻辑实体,然后立即关闭Realm。
任何人都可以确认为了让Realm同步正常工作,我必须拥有长期存在的Realm实例吗?在我再次关闭之前,Realm实例是否必须有足够的时间异步准备syncyng?或者在使用ROS时我应该注意一些其他方法吗?
谢谢