AdguardTeam / AdguardTeam/ContentBlocker
updateFilterEnabled() performs synchronous SQLite writes on the UI thread, causing UI freezes
- 主要言語
- Java
- スター
- 751
- フォーク
- 154
- 平均マージ
- 28分
- マージ済み PR(30日)
- 1
説明
**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.
コントリビューションガイド
このリポジトリのコントリビューションガイドは索引されていません
評価
この issue はまだ評価されていません。