Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android - using runOnUiThread to do UI changes from a thread

Tags:

I am using a custom title view and would like to show/hide a progressbar in the title view when a thread is working.

This is my title view's XML

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:orientation="horizontal"     android:layout_width="fill_parent"     android:layout_height="fill_parent" >     <Button         android:id="@+id/image_left_btn"         android:layout_width="75dip"          android:layout_height="wrap_content"          android:text="Back"     />     <TextView         android:id="@+id/image_title_text"         android:layout_width="wrap_content"          android:layout_height="wrap_content"          android:layout_weight="1"         android:textSize="20dip"         android:textStyle="bold"         android:textColor="#fff"         android:layout_gravity="center"         android:gravity="center"         android:paddingLeft="8dip"         android:paddingRight="8dip"     />     <ProgressBar          android:id="@+android:id/progress_small_title"         style="?android:attr/progressBarStyleSmall"         android:layout_width="75dip"         android:layout_height="wrap_content"          android:paddingRight="8dip"/> </LinearLayout> 

In my Activity, after setting this as the custom title bar, I do this

titleProgress = (ProgressBar)findViewById(R.id.progress_small_title); titleProgress.setVisibility(View.INVISIBLE); 

where titleProgress is ProgressBar object.

This is what I do in my thread

runOnUiThread(new Runnable() {     public void run() {         titleProgress.setVisibility(View.VISIBLE);     } }); //long operation here runOnUiThread(new Runnable() {     public void run() {         titleProgress.setVisibility(View.INVISIBLE);     } }); 

But there is no change to the progress bar. It is never displayed. Can someone please tell me what is wrong with the code?

Is it possible to display the title progressbar in a custom title?

Thanks.

like image 634
lostInTransit Avatar asked May 23 '09 09:05

lostInTransit


People also ask

Can we update UI from thread in Android?

In this case, to update the UI from a background thread, you can create a handler attached to the UI thread, and then post an action as a Runnable : Handler handler = new Handler(Looper. getMainLooper()); handler. post(new Runnable() { @Override public void run() { // update the ui from here } });

Can we update UI from thread?

Worker threads However, note that you cannot update the UI from any thread other than the UI thread or the "main" thread. To fix this problem, Android offers several ways to access the UI thread from other threads. Here is a list of methods that can help: Activity.

How do I use runOnUiThread on Android?

Step 1 − Create a new project in Android Studio, go to File ⇒ New Project and fill all required details to create a new project. Step 2 − Add the following code to res/layout/activity_main. xml. In the above code, we have taken one button and text view, when you click on button , it will update text view.


2 Answers

Few Things to try:

1) (This probably isn't it) Make sure "titleProgress" is volatile.

2) Try throwing a few postInvalidate() or titleProgress.postInvalidate() in there to trigger a redraw.

3) Have you sacraficed a x486 machine on an alter resembling a giant green robot? (just kidding)

Let me know if those first two (and if you're really desperate, the third) get you anywhere.

like image 166
haseman Avatar answered Sep 23 '22 10:09

haseman


What you should use in this case is AsyncTask, see http://developer.android.com/reference/android/os/AsyncTask.html

If you're not targeting a pre-1.5 version of Android, you will have to use a different class called UserTask. See http://android-developers.blogspot.com/2009/05/painless-threading.html

like image 40
Eddified Avatar answered Sep 21 '22 10:09

Eddified