Closed gelbertgel closed 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.
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?
I've released 0.4.0 with a findAllManagedWithChanges(false
just for you
thank you
Notify me if it still doesn't work as you expect.
findAll not working:(
Define not working
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
My mistake :disappointed: I fixed it in 0.4.1
Also for Kotlin considerations, I renamed method from , false
to findAllManagedWithChangesSync
.
thank you for fixing
Hey notifyItemRangeRemoved is not working since your change :/ 0.3.2 is working
Are you using this:
Technically I only emit my own "empty change set" for initial callback, then further change set calculation is done by Realm
EmptyChangeSet is not working from ManagedLiveResults
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+?
I cannot reproduce this one. Please give me code that "doesn't work" so that I can fix it.
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)
ok that is helpful, I made 0.4.2 where I reverted (partly) that postValue
was changed to setValue
BTW writeAsync
would work.
Thanks if anything happens again, can I tell you :)
Bug reports with stack traces (or "nothing is showing") are welcome :smile:
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());
}
}
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
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 ...
}
}
});
I think you should only create ONE instance of RealmThreadExecutor
please share example code.
See singleton pattern with double checked locks.
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;
}
}
}
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
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;
}
}
I think findAll and findAllAsync functions have to select optional at monarchyFindAll.. functions or liveResults realmResults variable has to settable variable.