From fbc301c284490b161c604d4973989ade08b9eb65 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Wed, 13 May 2026 16:41:41 -0400 Subject: [PATCH] Fix Sentry JETPACK-ANDROID-1GDC/1GEB/1GAF/1G8Z: move Reader DB writes off main Volley's ResponseDeliveryRunnable runs callbacks on the main thread, and two Reader paths then performed a SQLite compileStatement + execute on that callback. On a busy SQLite connection pool this exceeded the ANR budget. ReaderTagTable.setTagLastUpdated (called from ReaderPostRepository.requestPostsWithTag and requestPostsForLatestStream) now runs on a background Thread. ReaderBlogActions.handleUpdateBlogInfoResponse now performs ReaderBlogTable.addOrUpdateBlog on a background Thread and posts UpdateBlogInfoListener.onResult back on the main thread, since the existing callers (ReaderSiteHeaderView, ReaderFetchSiteUseCase) expect the result on main. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../ui/reader/actions/ReaderBlogActions.java | 16 ++++++++++------ .../ui/reader/repository/ReaderPostRepository.kt | 4 ++-- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderBlogActions.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderBlogActions.java index f8cf767d0971..fd6ee248e51f 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderBlogActions.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderBlogActions.java @@ -1,5 +1,7 @@ package org.wordpress.android.ui.reader.actions; +import android.os.Handler; +import android.os.Looper; import android.text.TextUtils; import android.util.Pair; @@ -456,12 +458,14 @@ private static void handleUpdateBlogInfoResponse(JSONObject jsonObject, UpdateBl return; } - ReaderBlog blogInfo = ReaderBlog.fromJson(jsonObject); - ReaderBlogTable.addOrUpdateBlog(blogInfo); - - if (infoListener != null) { - infoListener.onResult(blogInfo); - } + final ReaderBlog blogInfo = ReaderBlog.fromJson(jsonObject); + // Move the INSERT OR REPLACE off the main thread; callers expect onResult on main. + new Thread(() -> { + ReaderBlogTable.addOrUpdateBlog(blogInfo); + if (infoListener != null) { + new Handler(Looper.getMainLooper()).post(() -> infoListener.onResult(blogInfo)); + } + }).start(); } /* diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/ReaderPostRepository.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/ReaderPostRepository.kt index 475157150f62..788babca2467 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/ReaderPostRepository.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/ReaderPostRepository.kt @@ -116,7 +116,7 @@ class ReaderPostRepository @Inject constructor( if (updateAction == ReaderPostServiceStarter.UpdateAction.REQUEST_NEWER || updateAction == ReaderPostServiceStarter.UpdateAction.REQUEST_REFRESH ) { - ReaderTagTable.setTagLastUpdated(tag) + Thread { ReaderTagTable.setTagLastUpdated(tag) }.start() } handleUpdatePostsResponse(tag, jsonObject, updateAction, resultListener) } @@ -352,7 +352,7 @@ class ReaderPostRepository @Inject constructor( if (updateAction == ReaderPostServiceStarter.UpdateAction.REQUEST_NEWER || updateAction == ReaderPostServiceStarter.UpdateAction.REQUEST_REFRESH ) { - ReaderTagTable.setTagLastUpdated(tag) + Thread { ReaderTagTable.setTagLastUpdated(tag) }.start() } handleUpdatePostsResponse(tag, jsonObject, updateAction, resultListener) }