Java.lang.illegalstateexception: cannot invoke setvalue on a background thread

java.lang.IllegalStateException: Cannot invoke setValue on a background thread

This exception occurs when you try to update or modify a UI component from a background thread instead of the main UI thread. In Android, the UI toolkit is not thread safe and requires any updates to UI components to be done on the main thread.

Here’s an example to illustrate the issue:

public class BackgroundTask extends AsyncTask<Void, Void, Void> {
    private TextView textView;
  
    public BackgroundTask(TextView textView) {
        this.textView = textView;
    }
  
    protected Void doInBackground(Void... params) {
        // Perform some time-consuming task in the background
        return null;
    }
  
    protected void onPostExecute(Void result) {
        // Update the TextView on the main UI thread
        textView.setText("Task completed!");
    }
}
  
// Usage example
TextView textView = findViewById(R.id.textView);
BackgroundTask backgroundTask = new BackgroundTask(textView);
backgroundTask.execute();
  

In the above example, the doInBackground method executes a time-consuming task in the background using the AsyncTask class. However, in the onPostExecute method, the setText method is called on the TextView to update its content. This is not allowed since onPostExecute runs on the background thread.

To fix this issue, you need to ensure that any UI updates are performed on the main UI thread. Here’s an updated version of the code that fixes the problem:

protected void onPostExecute(Void result) {
    // Update the TextView on the main UI thread
    textView.post(new Runnable() {
        public void run() {
            textView.setText("Task completed!");
        }
    });
}
  

By using the post method of the View class, the Runnable is scheduled to run on the main UI thread, allowing the UI update to occur safely.

Read more

Leave a comment