Lucas @Moshidon 🇺🇦 🇵🇸 (npub1rx6…pdar)
Hello there. I'm thankful that you are continuing to keep what was Megalodon alive. I've tried other Mastodon client and always come back to this one.
But it crashes a couple times a week.
I get random-seeming crashes that I can't easily reproduce and the logs just look like a memory leak.
Is it worth me when opening an official bug report when I can't tell you anything about why it crashes?
I used to think it was related to previewing web pages with the built-in browser since my phone is set to use IronFox instead of Chrome or WebView. But I changed the setting to always launch in the full browser and it crashed again not long after.
I'm running it on a Google Pixel 7 Pro. I just rebooted to apply a security update this morning so I can't easily provide the OS version from last night's crash.<code>2.3.0+fork.110.moshinda-play (110)<br>2026-04-19T03:00:58.712Z<br><br>java.lang.OutOfMemoryError: Failed to allocate a 144 byte allocation with 4075008 free bytes and 3979KB until OOM, target footprint 536870912, growth limit 536870912; giving up on allocation because <1% of heap free after GC.<br> at java.lang.StringFactory.newStringFromBytes(Native Method)<br> at java.lang.StringLatin1.newString(StringLatin1.java:770)<br> at java.lang.StringBuilder.toString(StringBuilder.java:478)<br> at me.grishka.appkit.imageloader.requests.UrlImageLoaderRequest.<init>(UrlImageLoaderRequest.java:27)<br> at me.grishka.appkit.imageloader.requests.UrlImageLoaderRequest.<init>(UrlImageLoaderRequest.java:36)<br> at me.grishka.appkit.imageloader.requests.UrlImageLoaderRequest.<init>(UrlImageLoaderRequest.java:44)<br> at org.joinmastodon.android.ui.CustomEmojiPopupKeyboard$SingleCategoryAdapter.lambda$new$0(CustomEmojiPopupKeyboard.java:242)<br> at org.joinmastodon.android.ui.CustomEmojiPopupKeyboard$SingleCategoryAdapter.$r8$lambda$MVSWsH80noB7_zYH7nOGF_m6r4Q(CustomEmojiPopupKeyboard.java:0)<br> at org.joinmastodon.android.ui.CustomEmojiPopupKeyboard$SingleCategoryAdapter$$ExternalSyntheticLambda0.apply(R8$$SyntheticClass:0)<br> at j$.util.stream.o.accept(SourceFile:195)<br> at j$.util.a.forEachRemaining(SourceFile:720)<br> at j$.util.stream.a.t(SourceFile:484)<br> at j$.util.stream.a.K(SourceFile:474)<br> at j$.util.stream.x1.b(SourceFile:913)<br> at j$.util.stream.a.w(SourceFile:234)<br> at j$.util.stream.f2.collect(SourceFile:578)<br> at org.joinmastodon.android.ui.CustomEmojiPopupKeyboard$SingleCategoryAdapter.<init>(CustomEmojiPopupKeyboard.java:242)<br> at org.joinmastodon.android.ui.CustomEmojiPopupKeyboard.onCreateView(CustomEmojiPopupKeyboard.java:119)<br> at org.joinmastodon.android.ui.PopupKeyboard.ensureView(PopupKeyboard.java:41)<br> at org.joinmastodon.android.ui.PopupKeyboard.getView(PopupKeyboard.java:47)<br> at org.joinmastodon.android.ui.displayitems.EmojiReactionsStatusDisplayItem$Holder.onBind(EmojiReactionsStatusDisplayItem.java:207)<br> at org.joinmastodon.android.ui.displayitems.EmojiReactionsStatusDisplayItem$Holder.onBind(EmojiReactionsStatusDisplayItem.java:159)<br> at me.grishka.appkit.utils.BindableViewHolder.bind(BindableViewHolder.java:33)<br> at org.joinmastodon.android.fragments.BaseStatusListFragment$DisplayItemsAdapter.onBindViewHolder(BaseStatusListFragment.java:1226)<br> at org.joinmastodon.android.fragments.BaseStatusListFragment$DisplayItemsAdapter.onBindViewHolder(BaseStatusListFragment.java:1210)<br> at me.grishka.appkit.views.UsableRecyclerView$FooterRecyclerAdapter.onBindViewHolder(UsableRecyclerView.java:433)<br> at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:7256)<br> at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7339)<br> at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6197)<br> at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6463)<br> at androidx.recyclerview.widget.GapWorker.prefetchPositionWithDeadline(GapWorker.java:287)<br> at androidx.recyclerview.widget.GapWorker.flushTaskWithDeadline(GapWorker.java:344)<br> at androidx.recyclerview.widget.GapWorker.flushTasksWithDeadline(GapWorker.java:360)<br> at androidx.recyclerview.widget.GapWorker.prefetch(GapWorker.java:367)<br> at androidx.recyclerview.widget.GapWorker.run(GapWorker.java:398)<br> at android.os.Handler.handleCallback(Handler.java:1095)<br> at android.os.Handler.dispatchMessageImpl(Handler.java:135)<br> at android.os.Handler.dispatchMessage(Handler.java:125)<br> at android.os.Looper.loopOnce(Looper.java:269)<br> at android.os.Looper.loop(Looper.java:367)<br> at android.app.ActivityThread.main(ActivityThread.java:9333)<br> at java.lang.reflect.Method.invoke(Native Method)<br> at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:566)<br> at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:929)<br></code>