2017-08-16 20 views
-1

境界3.5.0Androd,境界:Realm.getDefaultInstance(),IllegalStateException異常:downloadAllServerChanges()不能從主線程調用

在我的應用程序類我登錄到域對象服務器和成功後,我設置的境界集默認配置。

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) 
+0

'downloadAllServerChanges()不能從主線程調用。因此,創建一個新線程並在那裏調用該函數 – 0xDEADC0DE

回答

1

.waitForInitialRemoteData()使用網絡,這樣你就不會不準叫Realm.getInstance() UI線程與該設置任何配置。它會ANR你的應用程序。這也應記錄在Javadoc waitForInitialRemoteData

取而代之,您可以使用Realm.getInstanceAsync(),它將在後臺線程上加載數據,並在準備就緒時返回Realm實例。

+0

雖然這有點棘手,這是否意味着如果您使用多個活動,那麼您需要在每個打開Realm的地方使用'Realm.getInstanceAsync()'(on UI線程)?嗯...... – EpicPandaForce

+1

是的,那就是暗示。或者,我們有'SyncSession.downloadAllServerChanges()',可以在後臺線程上手動調用,但如果您希望在打開任何使用Realm之前下載100%確定的更改,則需要與您的UI進行協調。 –

相關問題