Skip to content

updateFilterEnabled() performs synchronous SQLite writes on the UI thread, causing UI freezes #484

Description

@nbd-boss

Description:
The updateFilterEnabled() method is invoked directly inside a View FilterViewAdapter.onClick() callback, which always runs on the main (UI) thread. However, this method performs synchronous SQLite write operations, including:

  • db.beginTransaction()
  • db.update(...)
  • db.setTransactionSuccessful()
  • db.endTransaction()

These calls involve disk I/O, database locking, and fsync operations, all executed synchronously.
Executing them on the main thread can lead to noticeable UI jank or freezes, especially on:

  • devices with slower storage
  • devices under heavy I/O load
  • large or fragmented database files

Because this logic is triggered inside a click handler, the UI freeze is visible as delayed button response or stuttering.

Additionally, ApplyAndRefreshTask is executed after the blocking database operations have already completed, so it does not prevent the UI thread from stalling.


Why this is a problem

Android documentation explicitly warns:

Do not access SQLiteDatabase on the main thread.
Disk I/O can block the UI thread and cause ANRs.

This implementation violates that guideline and introduces potential jank every time a filter is enabled/disabled.


Suggested Fix

Move the database write operation off the UI thread. After the write completes, post back to the UI thread to update the checkbox state.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions