Zhuinden / realm-monarchy

[ACTIVE-ISH] A wrapper over Realm which exposes it as LiveData, managing Realm lifecycle internally.
Apache License 2.0
88 stars 11 forks source link

findAllAsync in monarchyFindAll... functions #15

Closed gelbertgel closed 6 years ago

gelbertgel commented 6 years ago

I think findAll and findAllAsync functions have to select optional at monarchyFindAll.. functions or liveResults realmResults variable has to settable variable.

class ManagedLiveResults<T extends RealmModel>
        extends MutableLiveData<Monarchy.ManagedChangeSet<T>> {

    private boolean isAsync = false;

    ...
   /**
   @params isAsync : findAllAsync ? findAll    
  **/
  public ManagedLiveResults(Monarchy monarchy, Monarchy.Query<T> query, boolean isAsync) {
        this.monarchy = monarchy;
        this.query = query;
        this.isAsync = isAsync;

        this.realmConfiguration = this.monarchy.getRealmConfiguration();
    }

    @Override
    protected void onActive() {
        realm = Realm.getInstance(realmConfiguration);
        if(isAsync){
        realmResults = query.createQuery(realm).findAllAsync(); }
        else{
       realmResults = query.createQuery(realm).findAll(); 
       }
        realmResults.addChangeListener(realmChangeListener);
    }
Zhuinden commented 6 years ago

Are you sure? If it currently "takes a few seconds" to load, that means those few seconds would be blocking the UI thread with sync query.

But technically I can add it.

gelbertgel commented 6 years ago

updateData function is running before ManagedLiveResult postValue therefore When adapter is starting, item count equals 0 or ex item count. How can I do that?

Zhuinden commented 6 years ago

I've released 0.4.0 with a findAllManagedWithChanges(false just for you

gelbertgel commented 6 years ago

thank you

Zhuinden commented 6 years ago

Notify me if it still doesn't work as you expect.

gelbertgel commented 6 years ago

findAll not working:(

Zhuinden commented 6 years ago

Define not working

gelbertgel commented 6 years ago

Sorry. I used :

users = RealmManager.getMonarchy().findAllManagedWithChanges(
                    realm -> realm.where(User.class)
                            .sort("markedDisplayName", Sort.ASCENDING), false);

I did not make any code changes.

Users and ManagedLiveResults are not empty but adapter's onCreateViewHolder, onBindViewHolder ... all of them aren't calling. Adapters' realmresults are null and even if updateData function has called normally, all functions are not working.

Because adapter's constructor must has users and before calling getItemCount function. Please share example adapter code and fragments, activities by findAll function

Zhuinden commented 6 years ago

My mistake :disappointed: I fixed it in 0.4.1

Also for Kotlin considerations, I renamed method from , false to findAllManagedWithChangesSync.

gelbertgel commented 6 years ago

thank you for fixing

gelbertgel commented 6 years ago

Hey notifyItemRangeRemoved is not working since your change :/ 0.3.2 is working

Zhuinden commented 6 years ago

Are you using this:

https://github.com/Zhuinden/realm-monarchy/blob/b9743b3c1182ba6956b00e402bf942fc52b87b21/monarchy-example/src/main/java/com/zhuinden/monarchyexample/features/managed/MonarchyDiffResult.java#L21-L43

Technically I only emit my own "empty change set" for initial callback, then further change set calculation is done by Realm

gelbertgel commented 6 years ago

EmptyChangeSet is not working from ManagedLiveResults

Zhuinden commented 6 years ago

that's weird, it works for me...? This time I actually ran it (i honestly should have before) and it returns State.INITIAL as expected. Are you using Realm 5.0+?

Zhuinden commented 6 years ago

I cannot reproduce this one. Please give me code that "doesn't work" so that I can fix it.

gelbertgel commented 6 years ago

I have just removed item:

 runTransactionSync(new Realm.Transaction() {
            @Override
            public void execute(@NonNull Realm realm) {
                new MessageAndHeaderCRUD().deleteMessageNoTransactionById(messageId, realm);
            }
        });

Delete item from realm correctly then calling the adapter notifyItemRangeRemoved and boom.

I didn't change code. my logcat stacktrace:

JNI NewLocalRef called with pending exception java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling android.support.v7.widget.RecyclerView{4d3d855 VFED.V... ......ID 7,7-1433,2018 #7f090072 app:id/chatList}, adapter:com.chat.android.conversation.adapter.ConversationAdapter@c1c49e0, layout:com.chat.android.util.view.WrapContentLinearLayoutManager@db326a, context:com.chat.android.conversation.ConversationActivity@71394a1
    art/runtime/java_vm_ext.cc:470]   at void android.support.v7.widget.RecyclerView.assertNotInLayoutOrScroll(java.lang.String) (RecyclerView.java:2769)
    art/runtime/java_vm_ext.cc:470]   at void android.support.v7.widget.RecyclerView$RecyclerViewDataObserver.onItemRangeRemoved(int, int) (RecyclerView.java:5204)
    art/runtime/java_vm_ext.cc:470]   at void android.support.v7.widget.RecyclerView$AdapterDataObservable.notifyItemRangeRemoved(int, int) (RecyclerView.java:11820)
    art/runtime/java_vm_ext.cc:470]   at void android.support.v7.widget.RecyclerView$Adapter.notifyItemRangeRemoved(int, int) (RecyclerView.java:7139)
    art/runtime/java_vm_ext.cc:470]   at void com.chat.android.dao.adapterDiffResults.RealmDiffResult.dispatchUpdatesTo(android.support.v7.widget.RecyclerView$Adapter) (RealmDiffResult.java:42)
    art/runtime/java_vm_ext.cc:470]   at void com.chat.android.dao.adapter.RealmAdapter.updateData(java.util.List, com.chat.android.util.CustomDiffResult) (RealmAdapter.java:87)
    art/runtime/java_vm_ext.cc:470]   at void com.chat.android.conversation.ConversationFragment.lambda$setAdapterDatas$0$ConversationFragment(com.chat.android.dao.adapter.RealmAdapter$ManagedChangeSet) (ConversationFragment.java:227)
    art/runtime/java_vm_ext.cc:470]   at void com.chat.android.conversation.ConversationFragment$$Lambda$0.onChanged(java.lang.Object) ((null):-1)
    art/runtime/java_vm_ext.cc:470]   at void android.arch.lifecycle.LiveData.considerNotify(android.arch.lifecycle.LiveData$ObserverWrapper) (LiveData.java:109)
    art/runtime/java_vm_ext.cc:470]   at void android.arch.lifecycle.LiveData.dispatchingValue(android.arch.lifecycle.LiveData$ObserverWrapper) (LiveData.java:126)
    art/runtime/java_vm_ext.cc:470]   at void android.arch.lifecycle.LiveData.setValue(java.lang.Object) (LiveData.java:282)
    art/runtime/java_vm_ext.cc:470]   at void android.arch.lifecycle.MutableLiveData.setValue(java.lang.Object) (MutableLiveData.java:33)
    art/runtime/java_vm_ext.cc:470]   at void com.chat.android.dao.adapter.ManagedLiveResults$1.onChange(io.realm.RealmResults, io.realm.OrderedCollectionChangeSet) (ManagedLiveResults.java:77)
    art/runtime/java_vm_ext.cc:470]   at void com.chat.android.dao.adapter.ManagedLiveResults$1.onChange(java.lang.Object, io.realm.OrderedCollectionChangeSet) (ManagedLiveResults.java:74)
    art/runtime/java_vm_ext.cc:470]   at void io.realm.internal.ObservableCollection$CollectionObserverPair.onChange(java.lang.Object, io.realm.internal.OsCollectionChangeSet) (ObservableCollection.java:20)
    art/runtime/java_vm_ext.cc:470]   at void io.realm.internal.ObservableCollection$Callback.onCalled(io.realm.internal.ObservableCollection$CollectionObserverPair, java.lang.Object) (ObservableCollection.java:64)
    art/runtime/java_vm_ext.cc:470]   at void io.realm.internal.ObservableCollection$Callback.onCalled(io.realm.internal.ObserverPairList$ObserverPair, java.lang.Object) (ObservableCollection.java:54)
    art/runtime/java_vm_ext.cc:470]   at void io.realm.internal.ObserverPairList.foreach(io.realm.internal.ObserverPairList$Callback) (ObserverPairList.java:109)
    art/runtime/java_vm_ext.cc:470]   at void io.realm.internal.OsResults.notifyChangeListeners(long) (OsResults.java:451)
    art/runtime/java_vm_ext.cc:470]   at void io.realm.internal.OsSharedRealm.nativeCommitTransaction(long) (OsSharedRealm.java:-2)
    art/runtime/java_vm_ext.cc:470]   at void io.realm.internal.OsSharedRealm.commitTransaction() (OsSharedRealm.java:273)
    art/runtime/java_vm_ext.cc:470]   at void io.realm.BaseRealm.commitTransaction() (BaseRealm.java:414)
    art/runtime/java_vm_ext.cc:470]   at void io.realm.Realm.commitTransaction() (Realm.java:146)
    art/runtime/java_vm_ext.cc:470]   at void io.realm.Realm.executeTransaction(io.realm.Realm$Transaction) (Realm.java:1420)
    art/runtime/java_vm_ext.cc:470]   at void com.chat.android.conversation.model.ConversationItem.deleteMessage() (ConversationItem.java:315)
    art/runtime/java_vm_ext.cc:470]   at void com.chat.android.conversation.view.ConversationImageView.setImage() (ConversationImageView.java:114)
    art/runtime/java_vm_ext.cc:470]   at void com.chat.android.conversation.view.ConversationImageView.setConversationItem(com.chat.android.conversation.model.ConversationItem) (ConversationImageView.java:91)
    art/runtime/java_vm_ext.cc:470]   at void com.chat.android.conversation.view.ConversationTypesView.castImage() (ConversationTypesView.java:186)
    art/runtime/java_vm_ext.cc:470]   at void com.chat.android.conversation.model.ConversationItem.messageTypeController() (ConversationItem.java:216)
    art/runtime/java_vm_ext.cc:470]   at void com.chat.android.conversation.model.ConversationItem.bind(int, java.util.LinkedHashSet, com.chat.android.GlideRequests, io.realm.Realm) (ConversationItem.java:146)
    art/runtime/java_vm_ext.cc:470]   at void com.chat.android.conversation.adapter.ConversationAdapter.onBindItemViewHolder(android.support.v7.widget.RecyclerView$ViewHolder, com.chat.android.dao.model.message.Message) (ConversationAdapter.java:393)
    art/runtime/java_vm_ext.cc:470]   at void com.chat.android.conversation.adapter.ConversationAdapter.onBindViewHolder(android.support.v7.widget.RecyclerView$ViewHolder, int) (ConversationAdapter.java:211)
    art/runtime/java_vm_ext.cc:470]   at void android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(android.support.v7.widget.RecyclerView$ViewHolder, int, java.util.List) (RecyclerView.java:6673)
    art/runtime/java_vm_ext.cc:470]   at void android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(android.support.v7.widget.RecyclerView$ViewHolder, int) (RecyclerView.java:6714)
    art/runtime/java_vm_ext.cc:470]   at boolean android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(android.support.v7.widget.RecyclerView$ViewHolder, int, int, long) (RecyclerView.java:5647)
    art/runtime/java_vm_ext.cc:470]   at android.support.v7.widget.RecyclerView$ViewHolder android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(int, boolean, long) (RecyclerView.java:5913)
    art/runtime/java_vm_ext.cc:470]   at android.view.View android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(int, boolean) (RecyclerView.java:5752)
    art/runtime/java_vm_ext.cc:470]   at android.view.View android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(int) (RecyclerView.java:5748)
    art/runtime/java_vm_ext.cc:470]   at android.view.View android.support.v7.widget.LinearLayoutManager$LayoutState.next(android.support.v7.widget.RecyclerView$Recycler) (LinearLayoutManager.java:2232)
    art/runtime/java_vm_ext.cc:470]   at void android.support.v7.widget.LinearLayoutManager.layoutChunk(android.support.v7.widget.RecyclerView$Recycler, android.support.v7.widget.RecyclerView$State, android.support.v7.widget.LinearLayoutManager$LayoutState, android.support.v7.widget.LinearLayoutManager$LayoutChunkResult) (LinearLayoutManager.java:1559)
    art/runtime/java_vm_ext.cc:470]   at int android.support.v7.widget.LinearLayoutManager.fill(android.support.v7.widget.RecyclerView$Recycler, android.support.v7.widget.LinearLayoutManager$LayoutState, android.support.v7.widget.RecyclerView$State, boolean) (LinearLayoutManager.java:1519)
    art/runtime/java_vm_ext.cc:470]   at void android.support.v7.widget.LinearLayoutManager.onLayoutChildren(android.support.v7.widget.RecyclerView$Recycler, android.support.v7.widget.RecyclerView$State) (LinearLayoutManager.java:614)
    art/runtime/java_vm_ext.cc:470]   at void com.chat.android.util.view.WrapContentLinearLayoutManager.onLayoutChildren(android.support.v7.widget.RecyclerView$Recycler, android.support.v7.widget.RecyclerView$State) (WrapContentLinearLayoutManager.java:16)
    art/runtime/java_vm_ext.cc:470]   at void android.support.v7.widget.RecyclerView.dispatchLayoutStep2() (RecyclerView.java:3812)
    art/runtime/java_vm_ext.cc:470]   at void android.support.v7.widget.RecyclerView.dispatchLayout() (RecyclerView.java:3529)
    art/runtime/java_vm_ext.cc:470]   at void android.support.v7.widget.RecyclerView.onLayout(boolean, int, int, int, int) (RecyclerView.java:4082)
    art/runtime/java_vm_ext.cc:470]   at void android.view.View.layout(int, int, int, int) (View.java:18798)
    art/runtime/java_vm_ext.cc:470]   at void android.view.ViewGroup.layout(int, int, int, int) (ViewGroup.java:5951)
    art/runtime/java_vm_ext.cc:470]   at void android.widget.FrameLayout.layoutChildren(int, int, int, int, boolean) (FrameLayout.java:323)
    art/runtime/java_vm_ext.cc:470]   at void android.widget.FrameLayout.onLayout(boolean, int, int, int, int) (FrameLayout.java:261)
    art/runtime/java_vm_ext.cc:470]   at void android.view.View.layout(int, int, int, int) (View.java:18798)
    art/runtime/java_vm_ext.cc:470]   at void android.view.ViewGroup.layout(int, int, int, int) (ViewGroup.java:5951)
    art/runtime/java_vm_ext.cc:470]   at void android.widget.RelativeLayout.onLayout(boolean, int, int, int, int) (RelativeLayout.java:1079)
    art/runtime/java_vm_ext.cc:470]   at void android.view.View.layout(int, int, int, int) (View.java:18798)
    art/runtime/java_vm_ext.cc:470]   at void android.view.ViewGroup.layout(int, int, int, int) (ViewGroup.java:5951)
    art/runtime/java_vm_ext.cc:470]   at void android.widget.FrameLayout.layoutChildren(int, int, int, int, boolean) (FrameLayout.java:323)
    art/runtime/java_vm_ext.cc:470]   at void android.widget.FrameLayout.onLayout(boolean, int, int, int, int) (FrameLayout.java:261)
    art/runtime/java_vm_ext.cc:470]   at void android.view.View.layout(int, int, int, int) (View.java:18798)
    art/runtime/java_vm_ext.cc:470]   at void android.view.ViewGroup.layout(int, int, int, int) (ViewGroup.java:5951)
    art/runtime/java_vm_ext.cc:470]   at void android.widget.LinearLayout.setChildFrame(android.view.View, int, int, int, int) (LinearLayout.java:1741)
    art/runtime/java_vm_ext.cc:470]   at void android.widget.LinearLayout.layoutVertical(int, int, int, int) (LinearLayout.java:1585)
    art/runtime/java_vm_ext.cc:470]   at void android.widget.LinearLayout.onLayout(boolean, int, int, int, int) (LinearLayout.java:1494)
    art/runtime/java_vm_ext.cc:470]   at void android.view.View.layout(int, int, int, int) (View.java:18798)
    art/runtime/java_vm_ext.cc:470]   at void android.view.ViewGroup.layout(int, int, int, int) (ViewGroup.java:5951)
    art/runtime/java_vm_ext.cc:470]   at void android.widget.RelativeLayout.onLayout(boolean, int, int, int, int) (RelativeLayout.java:1079)
    art/runtime/java_vm_ext.cc:470]   at void android.view.View.layout(int, int, int, int) (View.java:18798)
    art/runtime/java_vm_ext.cc:470]   at void android.view.ViewGroup.layout(int, int, int, int) (ViewGroup.java:5951)
    art/runtime/java_vm_ext.cc:470]   at void android.widget.FrameLayout.layoutChildren(int, int, int, int, boolean) (FrameLayout.java:323)
    art/runtime/java_vm_ext.cc:470]   at void android.widget.FrameLayout.onLayout(boolean, int, int, int, int) (FrameLayout.java:261)
    art/runtime/java_vm_ext.cc:470]   at void android.view.View.layout(int, int, int, int) (View.java:18798)
    art/runtime/java_vm_ext.cc:470]   at void android.view.ViewGroup.layout(int, int, int, int) (ViewGroup.java:5951)
    art/runtime/java_vm_ext.cc:470]   at void android.widget.FrameLayout.layoutChildren(int, int, int, int, boolean) (FrameLayout.java:323)
    art/runtime/java_vm_ext.cc:470]   at void android.widget.FrameLayout.onLayout(boolean, int, int, int, int) (FrameLayout.java:261)
    art/runtime/java_vm_ext.cc:470]   at void android.view.View.layout(int, int, int, int) (View.java:18798)
    art/runtime/java_vm_ext.cc:470]   at void android.view.ViewGroup.layout(int, int, int, int) (ViewGroup.java:5951)
    art/runtime/java_vm_ext.cc:470]   at void android.widget.FrameLayout.layoutChildren(int, int, int, int, boolean) (FrameLayout.java:323)
    art/runtime/java_vm_ext.cc:470]   at void android.widget.FrameLayout.onLayout(boolean, int, int, int, int) (FrameLayout.java:261)
    art/runtime/java_vm_ext.cc:470]   at void android.view.View.layout(int, int, int, int) (View.java:18798)
    art/runtime/java_vm_ext.cc:470]   at void android.view.ViewGroup.layout(int, int, int, int) (ViewGroup.java:5951)
    art/runtime/java_vm_ext.cc:470]   at void android.widget.LinearLayout.setChildFrame(android.view.View, int, int, int, int) (LinearLayout.java:1741)
    art/runtime/java_vm_ext.cc:470]   at void android.widget.LinearLayout.layoutVertical(int, int, int, int) (LinearLayout.java:1585)
    art/runtime/java_vm_ext.cc:470]   at void android.widget.LinearLayout.onLayout(boolean, int, int, int, int) (LinearLayout.java:1494)
    art/runtime/java_vm_ext.cc:470]   at void android.view.View.layout(int, int, int, int) (View.java:18798)
    art/runtime/java_vm_ext.cc:470]   at void android.view.ViewGroup.layout(int, int, int, int) (ViewGroup.java:5951)
    art/runtime/java_vm_ext.cc:470]   at void android.widget.FrameLayout.layoutChildren(int, int, int, int, boolean) (FrameLayout.java:323)
    art/runtime/java_vm_ext.cc:470]   at void android.widget.FrameLayout.onLayout(boolean, int, int, int, int) (FrameLayout.java:261)
    art/runtime/java_vm_ext.cc:470]   at void com.android.internal.policy.DecorView.onLayout(boolean, int, int, int, int) (DecorView.java:887)
    art/runtime/java_vm_ext.cc:470]   at void android.view.View.layout(int, int, int, int) (View.java:18798)
    art/runtime/java_vm_ext.cc:470]   at void android.view.ViewGroup.layout(int, int, int, int) (ViewGroup.java:5951)
    art/runtime/java_vm_ext.cc:470]   at void android.view.ViewRootImpl.performLayout(android.view.WindowManager$LayoutParams, int, int) (ViewRootImpl.java:2648)
    art/runtime/java_vm_ext.cc:470]   at void android.view.ViewRootImpl.performTraversals() (ViewRootImpl.java:2364)
    art/runtime/java_vm_ext.cc:470]   at void android.view.ViewRootImpl.doTraversal() (ViewRootImpl.java:1515)
    art/runtime/java_vm_ext.cc:470]   at void android.view.ViewRootImpl$TraversalRunnable.run() (ViewRootImpl.java:7091)
    art/runtime/java_vm_ext.cc:470]   at void android.view.Choreographer$CallbackRecord.run(long) (Choreographer.java:927)
    art/runtime/java_vm_ext.cc:470]   at void android.view.Choreographer.doCallbacks(int, long) (Choreographer.java:702)
    art/runtime/java_vm_ext.cc:470]   at void android.view.Choreographer.doFrame(long, int) (Choreographer.java:638)
    art/runtime/java_vm_ext.cc:470]   at void android.view.Choreographer$FrameDisplayEventReceiver.run() (Choreographer.java:913)
    art/runtime/java_vm_ext.cc:470]   at void android.os.Handler.handleCallback(android.os.Message) (Handler.java:751)
    art/runtime/java_vm_ext.cc:470]   at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:95)
    art/runtime/java_vm_ext.cc:470]   at void android.os.Looper.loop() (Looper.java:154)
    art/runtime/java_vm_ext.cc:470]   at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6682)
    art/runtime/java_vm_ext.cc:470]   at java.lang.Object java.lang.reflect.Method.invoke!(java.lang.Object, java.lang.Object[]) (Method.java:-2)
    art/runtime/java_vm_ext.cc:470]   at void com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run() (ZygoteInit.java:1520)
    art/runtime/java_vm_ext.cc:470]   at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:1410)
    art/runtime/java_vm_ext.cc:470] 
    art/runtime/java_vm_ext.cc:470]     in call to NewLocalRef
    art/runtime/java_vm_ext.cc:470]     from void io.realm.internal.OsSharedRealm.nativeCommitTransaction(long)
07-27 16:13:30.220 12704-12704/com.juphoon.justalk A/art: art/runtime/java_vm_ext.cc:470] "main" prio=5 tid=1 Runnable
    art/runtime/java_vm_ext.cc:470]   | group="main" sCount=0 dsCount=0 obj=0x76382c98 self=0x6fffec7a00
    art/runtime/java_vm_ext.cc:470]   | sysTid=12704 nice=-4 cgrp=default sched=0/0 handle=0x70047d0a98
    art/runtime/java_vm_ext.cc:470]   | state=R schedstat=( 0 0 0 ) utm=363 stm=46 core=4 HZ=100
    art/runtime/java_vm_ext.cc:470]   | stack=0x7fe394c000-0x7fe394e000 stackSize=8MB
    art/runtime/java_vm_ext.cc:470]   | held mutexes= "mutator lock"(shared held)
    art/runtime/java_vm_ext.cc:470]   native: #00 pc 0000000000478a90  /system/lib64/libart.so (_ZN3art15DumpNativeStackERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEEiP12BacktraceMapPKcPNS_9ArtMethodEPv+220)
    art/runtime/java_vm_ext.cc:470]   native: #01 pc 0000000000478a8c  /system/lib64/libart.so (_ZN3art15DumpNativeStackERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEEiP12BacktraceMapPKcPNS_9ArtMethodEPv+216)
    art/runtime/java_vm_ext.cc:470]   native: #02 pc 000000000044d000  /system/lib64/libart.so (_ZNK3art6Thread9DumpStackERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEbP12BacktraceMap+472)
    art/runtime/java_vm_ext.cc:470]   native: #03 pc 00000000002ed8cc  /system/lib64/libart.so (_ZN3art9JavaVMExt8JniAbortEPKcS2_+1128)
    art/runtime/java_vm_ext.cc:470]   native: #04 pc 00000000002edfb4  /system/lib64/libart.so (_ZN3art9JavaVMExt9JniAbortVEPKcS2_St9__va_list+120)
    art/runtime/java_vm_ext.cc:470]   native: #05 pc 0000000000101c88  /system/lib64/libart.so (_ZN3art11ScopedCheck6AbortFEPKcz+156)
    art/runtime/java_vm_ext.cc:470]   native: #06 pc 0000000000101698  /system/lib64/libart.so (_ZN3art11ScopedCheck11CheckThreadEP7_JNIEnv+544)
    art/runtime/java_vm_ext.cc:470]   native: #07 pc 00000000000ff1d0  /system/lib64/libart.so (_ZN3art11ScopedCheck5CheckERNS_18ScopedObjectAccessEbPKcPNS_12JniValueTypeE+1120)
    art/runtime/java_vm_ext.cc:470]   native: #08 pc 0000000000102ef4  /system/lib64/libart.so (_ZN3art8CheckJNI6NewRefEPKcP7_JNIEnvP8_jobjectNS_15IndirectRefKindE+632)
    art/runtime/java_vm_ext.cc:470]   native: #09 pc 00000000001435e8  /data/app/com.juphoon.justalk-1/lib/arm64/librealm-jni.so (???)
    art/runtime/java_vm_ext.cc:470]   native: #10 pc 000000000013d63c  /data/app/com.juphoon.justalk-1/lib/arm64/librealm-jni.so (???)
    art/runtime/java_vm_ext.cc:470]   native: #11 pc 00000000001a7438  /data/app/com.juphoon.justalk-1/lib/arm64/librealm-jni.so (???)
    art/runtime/java_vm_ext.cc:470]   native: #12 pc 00000000001a75dc  /data/app/com.juphoon.justalk-1/lib/arm64/librealm-jni.so (???)
    art/runtime/java_vm_ext.cc:470]   native: #13 pc 0000000000190150  /data/app/com.juphoon.justalk-1/lib/arm64/librealm-jni.so (???)
    art/runtime/java_vm_ext.cc:470]   native: #14 pc 0000000000173c64  /data/app/com.juphoon.justalk-1/lib/arm64/librealm-jni.so (???)
    art/runtime/java_vm_ext.cc:470]   native: #15 pc 00000000000ed8ac  /data/app/com.juphoon.justalk-1/lib/arm64/librealm-jni.so (Java_io_realm_internal_OsSharedRealm_nativeCommitTransaction+64)
    art/runtime/java_vm_ext.cc:470]   native: #16 pc 00000000000db490  /system/lib64/libart.so (art_quick_generic_jni_trampoline+144)
    art/runtime/java_vm_ext.cc:470]   native: #17 pc 00000000000d2168  /system/lib64/libart.so (art_quick_invoke_static_stub+600)
    art/runtime/java_vm_ext.cc:470]   native: #18 pc 00000000000debb8  /system/lib64/libart.so (_ZN3art9ArtMethod6InvokeEPNS_6ThreadEPjjPNS_6JValueEPKc+256)
    art/runtime/java_vm_ext.cc:470]   native: #19 pc 000000000028dde4  /system/lib64/libart.so (_ZN3art11interpreter34ArtInterpreterToCompiledCodeBridgeEPNS_6ThreadEPNS_9ArtMethodEPKNS_7DexFile8CodeItemEPNS_11ShadowFrameEPNS_6JValueE+312)
    art/runtime/java_vm_ext.cc:470]   native: #20 pc 0000000000286dc0  /system/lib64/libart.so (_ZN3art11interpreter6DoCallILb0ELb0EEEbPNS_9ArtMethodEPNS_6ThreadERNS_11ShadowFrameEPKNS_11InstructionEtPNS_6JValueE+592)
    art/runtime/java_vm_ext.cc:470]   native: #21 pc 0000000000554740  /system/lib64/libart.so (MterpInvokeStatic+356)
    art/runtime/java_vm_ext.cc:470]   native: #22 pc 00000000000c4a14  /system/lib64/libart.so (ExecuteMterpImpl+14612)
    art/runtime/java_vm_ext.cc:470]   at io.realm.internal.OsSharedRealm.nativeCommitTransaction(Native method)
    art/runtime/java_vm_ext.cc:470]   at io.realm.internal.OsSharedRealm.commitTransaction(OsSharedRealm.java:273)
    art/runtime/java_vm_ext.cc:470]   at io.realm.BaseRealm.commitTransaction(BaseRealm.java:414)
    art/runtime/java_vm_ext.cc:470]   at io.realm.Realm.commitTransaction(Realm.java:146)
    art/runtime/java_vm_ext.cc:470]   at io.realm.Realm.executeTransaction(Realm.java:1420)
Zhuinden commented 6 years ago

ok that is helpful, I made 0.4.2 where I reverted (partly) that postValue was changed to setValue

BTW writeAsync would work.

gelbertgel commented 6 years ago

Thanks if anything happens again, can I tell you :)

Zhuinden commented 6 years ago

Bug reports with stack traces (or "nothing is showing") are welcome :smile:

gelbertgel commented 6 years ago

irrelevant to all of this , my realmThreadPoolExecutor is causing out of memory because of very threadpoolExecutor usage in the app usage. How can I do that? Please help me.

public class RealmThreadExecutor extends ThreadPoolExecutor {

    private String TAG = RealmThreadExecutor.class.getSimpleName();
    private RealmManager realmManager;

    public RealmThreadExecutor() {
        super(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
        realmManager = new RealmManager();
    }

    @Override
    protected void beforeExecute(Thread thread, Runnable runnable) {
        super.beforeExecute(thread, runnable);

        Realm realm = realmManager.getLocalInstance();

        RealmRunnable realmRunnable = (RealmRunnable) runnable;
        realmRunnable.setRealm(realm);
        realmRunnable.setThread(thread);
    }

    @Override
    protected void afterExecute(Runnable runnable, Throwable throwable) {
        super.afterExecute(runnable, throwable);

        RealmRunnable realmRunnable = (RealmRunnable) runnable;
        Realm realm = realmRunnable.getRealm();
        realmManager.close(realm);

        //stop threads
        realmRunnable.getThread().interrupt();
        shutdown();
    }

    private void printCurrentThreads() {

        Set<Thread> threadSet = Thread.getAllStackTraces().keySet();

        for (Thread thread : threadSet) {
            Mylog.i(TAG, " getAllCurrentThreadCount cikis : " + thread.getName());
        }
    }
Zhuinden commented 6 years ago

I hope you are making only one of these thread pools and use that everywhere else? Also I don't think you need to interrupt the thread and shutdown the executor

gelbertgel commented 6 years ago

realmthreadpoolexecutor is created when starting all realm operations and closes at the end of realm jobs. how should I use this?

I have realmRunnables:

public abstract class RealmRunnable implements Runnable {

    private Realm realm;
    private Thread thread;

    public Realm getRealm() {
        return realm;
    }

    public void setRealm(Realm realm) {
        this.realm = realm;
    }

    public void setThread(Thread thread) {
        this.thread = thread;
    }

    public Thread getThread() {
        return thread;
    }

}
RealmThreadExecutor realmThreadExecutor = new RealmThreadExecutor();

        realmThreadExecutor.execute(new RealmRunnable() {
            @Override
            public void run() {

                Realm mRealm = getRealm();
                ... realm operation ...
              }
            }
        });
Zhuinden commented 6 years ago

I think you should only create ONE instance of RealmThreadExecutor

gelbertgel commented 6 years ago

please share example code.

Zhuinden commented 6 years ago

See singleton pattern with double checked locks.

gelbertgel commented 6 years ago

can I verify you my teacher?

public class RealmThreadExecutor {

    private String TAG = RealmThreadExecutor.class.getSimpleName();
    private static RealmThreadExecutor instance = null;

    private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<>();
    /**
     * An {@link Executor} that can be used to execute tasks in parallel.
     */
    private static ThreadPoolExecutor threadPoolExecutor;

    public static RealmThreadExecutor getInstance() {

        if (instance == null) {
            synchronized (RealmThreadExecutor.class) {
                if (instance == null) {
                    instance = new RealmThreadExecutor();
                }
            }
        }

        return instance;
    }

    public synchronized void delete() {

        if (instance != null) {
            instance = null;
        }
    }

    public void addRealmRunnable(RealmRunnable realmRunnable) {

        if (sPoolWorkQueue.size() == 0) {
            getPoolExecutor().execute(realmRunnable);
        } else {
            sPoolWorkQueue.add(realmRunnable);
        }
    }

    private ThreadPoolExecutor getPoolExecutor() {

        if (threadPoolExecutor == null) {
            threadPoolExecutor = new ParallelExecutor();
        }
        return threadPoolExecutor;
    }

    private static class ParallelExecutor extends ThreadPoolExecutor {

        private RealmManager realmManager;

        public ParallelExecutor() {
            super(1, 1, 0L, TimeUnit.MILLISECONDS, sPoolWorkQueue, new BackgroundThreadFactory());

            realmManager = new RealmManager();
        }

        @Override
        protected void beforeExecute(Thread thread, Runnable runnable) {
            super.beforeExecute(thread, runnable);

            Realm realm = realmManager.getLocalInstance();

            RealmRunnable realmRunnable = (RealmRunnable) runnable;
            realmRunnable.setRealm(realm);
            realmRunnable.setThread(thread);
        }

        @Override
        protected void afterExecute(Runnable runnable, Throwable throwable) {
            super.afterExecute(runnable, throwable);

            RealmRunnable realmRunnable = (RealmRunnable) runnable;
            Realm realm = realmRunnable.getRealm();
            realmManager.close(realm);

            scheduleNext();
        }

        private synchronized void scheduleNext() {
            if (sPoolWorkQueue.size() != 0) {
                threadPoolExecutor.execute(sPoolWorkQueue.poll());
            } else {
                threadPoolExecutor.shutdown();
            }
        }
    }

    private static class BackgroundThreadFactory implements ThreadFactory {

        @Override
        public Thread newThread(@NonNull Runnable runnable) {
            Thread thread = new Thread(runnable);
            thread.setPriority(Process.THREAD_PRIORITY_BACKGROUND);

            return thread;
        }
    }
}
Zhuinden commented 6 years ago

1.) i don't think you need to shut down the scheduler when there are no tasks

2.) beforeExecute should be doing openLocalInstance instead of get

gelbertgel commented 6 years ago

I called "shutdown" to prevent data leakage. When I need to close the thread?

public class RealmThreadExecutor {

    private static String TAG = RealmThreadExecutor.class.getSimpleName();

    private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<>();
    /**
     * An {@link Executor} that can be used to execute tasks in parallel.
     */
    private static ThreadPoolExecutor threadPoolExecutor;

    public void addRealmRunnable(RealmRunnable realmRunnable) {

        if (sPoolWorkQueue.size() == 0) {
            getPoolExecutor().execute(realmRunnable);
        } else {
            sPoolWorkQueue.add(realmRunnable);
        }
    }

    private static ThreadPoolExecutor getPoolExecutor() {

        if (threadPoolExecutor == null) {
            threadPoolExecutor = new ParallelExecutor();
        }
        return threadPoolExecutor;
    }

    private static class ParallelExecutor extends ThreadPoolExecutor {

        private RealmManager realmManager;

        private ParallelExecutor() {
            super(1, 1, 0L, TimeUnit.MILLISECONDS, sPoolWorkQueue, new BackgroundThreadFactory());
            realmManager = new RealmManager();
        }

        @Override
        protected void beforeExecute(Thread thread, Runnable runnable) {
            super.beforeExecute(thread, runnable);

            Mylog.i(TAG, "beforeExecute currentThread : " + Thread.currentThread().getName());

            Realm realm = realmManager.open();

            RealmRunnable realmRunnable = (RealmRunnable) runnable;
            realmRunnable.setRealm(realm);
            realmRunnable.setThread(thread);
        }

        @Override
        protected void afterExecute(Runnable runnable, Throwable throwable) {
            super.afterExecute(runnable, throwable);

            Mylog.i(TAG, "afterExecute currentThread : " + Thread.currentThread().getName());

            RealmRunnable realmRunnable = (RealmRunnable) runnable;
            Realm realm = realmRunnable.getRealm();
            realmManager.close(realm);

            Thread thread = realmRunnable.getThread();
            thread.interrupt();  ------------> stop the thread is it true?

            scheduleNext();
        }

        private synchronized void scheduleNext() {
            if (sPoolWorkQueue.size() != 0) {
                getPoolExecutor().execute(sPoolWorkQueue.poll());
            } 
        }

    }

    private static class BackgroundThreadFactory implements ThreadFactory {

        @Override
        public Thread newThread(@NonNull Runnable runnable) {
            Thread thread = new Thread(runnable);
            thread.setPriority(Process.THREAD_PRIORITY_BACKGROUND);

            Mylog.i(TAG, " BackgroundThreadFactory currentThread : " + thread.getName() + " runnable : " + runnable);

            return thread;
        }
    }
gelbertgel commented 6 years ago

https://stackoverflow.com/questions/51607363/interrupt-threadpoolexecutors-thread