2017-08-16 3 views
-1

レルム3.5.0Androd、レルム:Realm.getDefaultInstance()は、IllegalStateException:downloadAllServerChangesは()私のApplicationクラスで

メインスレッドから呼び出すことができない私は、レルムオブジェクト・サーバにログインし、成功した後、私はレルムセットを設定しますデフォルト設定。

public class MyApp extends MultiDexApplication { 

...

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

}

OK。

私の断片では、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) 
+0

'downloadAllServerChanges()はメインスレッドから呼び出すことができません。したがって、新しいスレッドを作成してその関数を呼び出してください。 – 0xDEADC0DE

答えて

1

.waitForInitialRemoteData()は、ネットワークを使用していますので、あなたはその設定で任意の構成でUIスレッドでRealm.getInstance()を呼び出すことが許可されていません。あなたのアプリをANRするでしょう。これは、waitForInitialRemoteDataのJavadocにも記載する必要があります。

代わりに、Realm.getInstanceAsync()を使用すると、データがバックグラウンドスレッドにロードされ、準備が整い次第、Realmインスタンスが返されます。

+0

これはややこしいことですが、複数のアクティビティを使用する場合は、レルムを開いたすべての場所で 'Realm.getInstanceAsync()'を使用する必要があります。 UIスレッド)?うーん、.... – EpicPandaForce

+1

はい、それは意味です。代わりに、バックグラウンドスレッドで手動で呼び出すことができる 'SyncSession.downloadAllServerChanges()'がありますが、レルムを使用するものを開く前に変更がダウンロードされていることを100%確認するには、UIで調整する必要があります。 –

関連する問題