AdguardTeam / AdguardTeam/ContentBlocker

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

Đang mở
#484 0 bình luận 0 reaction 0 người được giao Xem trên GitHub
Ngôn ngữ chính
Java
Star
751
Fork
154
Merge trung bình
28 phút
Pull request đã merge (30 ngày)
1

Mô tả

**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.

Hướng dẫn đóng góp

Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.