From ba77d1b787f99e59b67bbbbfa6f6e382f5b0d7c3 Mon Sep 17 00:00:00 2001 From: Tom Hicks Date: Tue, 22 Sep 2026 21:50:49 -0700 Subject: [PATCH] Configure RxJava Global Error Handler to consume Unhandled thread interruptions harmlessly --- .../monstercards/MonsterCardsApplication.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Android/app/src/main/java/com/majinnaibu/monstercards/MonsterCardsApplication.java b/Android/app/src/main/java/com/majinnaibu/monstercards/MonsterCardsApplication.java index 45f3d4c..405ee87 100644 --- a/Android/app/src/main/java/com/majinnaibu/monstercards/MonsterCardsApplication.java +++ b/Android/app/src/main/java/com/majinnaibu/monstercards/MonsterCardsApplication.java @@ -10,6 +10,12 @@ import androidx.sqlite.db.SupportSQLiteDatabase; import com.majinnaibu.monstercards.data.MonsterRepository; +import io.reactivex.rxjava3.exceptions.UndeliverableException; +import io.reactivex.rxjava3.plugins.RxJavaPlugins; +import com.majinnaibu.monstercards.utils.Logger; + +import java.io.InterruptedIOException; + public class MonsterCardsApplication extends Application { private static final Migration MIGRATION_1_2 = new Migration(1, 2) { @@ -110,6 +116,19 @@ public class MonsterCardsApplication extends Application { @Override public void onCreate() { super.onCreate(); + + RxJavaPlugins.setErrorHandler(e -> { + if (e instanceof UndeliverableException) { + e = e.getCause(); + } + if (e instanceof InterruptedException || e instanceof InterruptedIOException) { + Logger.logWTF("RxJava Global Error Handler caught an expected InterruptedException upon disposal."); + return; + } + + Logger.logError("Undeliverable exception received by RxJava global handler", e); + }); + // Required initialization logic here! // .fallbackToDestructiveMigration()