【问题标题】:Androd, Realm: Realm.getDefaultInstance(), IllegalStateException: downloadAllServerChanges() cannot be called from the main threadAndrod, Realm: Realm.getDefaultInstance(), IllegalStateException: downloadAllServerChanges() 不能从主线程调用
【发布时间】:2017-08-16 08:30:26
【问题描述】:

境界 3.5.0

在我的应用程序类中,我登录到领域对象服务器,成功后我设置领域设置默认配置。

public class MyApp extends MultiDexApplication {

...

private void setRealmDefaultConfiguration(SyncUser syncUser, String realmURL) {
    SyncConfiguration config = new SyncConfiguration.Builder(syncUser, realmURL)
            .waitForInitialRemoteData()
            .build();
    Realm.setDefaultConfiguration(config);
}

}

好的。

在我的片段中,我尝试获取 Realm 实例。

public class MyFragment extends Fragment {

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

}

但我得到错误:

E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.IllegalStateException: downloadAllServerChanges() cannot be called from the main thread.
    at io.realm.SyncSession.checkIfNotOnMainThread(SyncSession.java:357)
    at io.realm.SyncSession.downloadAllServerChanges(SyncSession.java:322)
    at io.realm.internal.SyncObjectServerFacade.downloadRemoteChanges(SyncObjectServerFacade.java:176)
    at io.realm.RealmCache.doCreateRealmOrGetFromCache(RealmCache.java:305)
    at io.realm.RealmCache.createRealmOrGetFromCache(RealmCache.java:284)
    at io.realm.Realm.getDefaultInstance(Realm.java:281)
    at com.myproject.fragment.MyFragment.onCreateView(OrganizationsFragment.java:147)
    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1974)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252)
    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617)
    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517)
    at android.os.Handler.handleCallback(Handler.java:730)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:5103)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:525)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • downloadAllServerChanges() cannot be called from the main thread.;所以创建一个新线程并在那里调用该函数

标签: android realm


【解决方案1】:

.waitForInitialRemoteData() 使用网络,所以你不能在 UI 线程上调用Realm.getInstance() 与该设置的任何配置。它会 ANR 你的应用程序。这也应该记录在 waitForInitialRemoteData 的 Javadoc 中。

相反,您可以使用Realm.getInstanceAsync(),它会在后台线程上加载数据并在准备好后返回 Realm 实例。

【讨论】:

  • 这有点棘手,这是否意味着如果您使用多个活动,那么您需要在每个打开领域的地方(在 UI 线程上)使用Realm.getInstanceAsync()?嗯……
  • 是的,这就是暗示。或者,我们有 SyncSession.downloadAllServerChanges() 可以在后台线程上手动调用,但是如果您想 100% 确保在打开任何使用 Realm 的内容之前下载更改,则需要与您的 UI 协调。
猜你喜欢
  • 1970-01-01
  • 2019-06-18
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多