Skip to content

Micro Optimization: Redundant Calls to runOnUiThread #2344

@MichiMoments

Description

@MichiMoments

In the “updateEventType” function located in the folder “activities” file “TaskActivity.kt”, the current code unnecessarily splits UI updates across multiple contexts, with a single runOnUiThread block for some updates and implicit UI thread access for others.

Image

The issue lies in the separation of UI related operations. The runOnUiThread block updates “taskType.text” and calls “updateTaskColorInfo”, which presumably modifies the UI. However, the subsequent lines directly manipulate “binding.taskColorImage”, “binding.taskColorHolder”, and “binding.taskColorDivider” to set their visibility, also UI operations, but these are executed on the background thread (inside ensureBackgroundThread). This is problematic because Android requires all UI updates to occur on the main thread, and accessing UI elements from a background thread can cause crashes or undefined behavior. Additionally, even if these were intended to be on the UI thread, the current structure implies multiple context switches, which introduces overhead due to thread scheduling and message queue processing.

Proposition:
The proposed optimization is to consolidate all UI updates into a single runOnUiThread block to ensure thread safety and reduce context switching overhead. By moving the visibility updates for “taskColorImage”, “taskColorHolder”, and “taskColorDivider“ into the same runOnUiThread block as the text and color updates, we ensure that all UI operations are performed on the main thread in one go. This eliminates the risk of background thread UI access and minimizes the number of times the code switches between threads.

Image

The optimization of consolidating UI updates into a single runOnUiThread block in “TaskActivity.kt” enhances performance by eliminating the risk of crashes from background thread UI access, reducing context switching overhead, and improving code maintainability. By moving all UI operations, such as updating “binding.taskType.text” and visibility of elements like “binding.taskColorImage”, into one main thread block, it prevents exceptions like “CalledFromWrongThreadException” and subtle bugs. This also minimizes scheduling costs (time wasted per runOnUiThread call) by reducing the number of main thread messages, lowering CPU usage and latency. While the performance gain per execution is small, the benefits accumulate in frequent calls, enhancing stability and user experience in a task management app, conserving battery life on low resource Android devices, and making the code easier to maintain by clearly grouping UI logic.

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