Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android: Accessing UI Element from timer thread

public Button stb;
static int cnt=0;
public ArrayList<RadioButton> Butgrp1 = new ArrayList<RadioButton>();
Timer myt; 
TimerTask t;
stb.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

myt.mschedule(new TimerTask() {

    @Override
    public void run() {

        // TODO Auto-generated method stub


        System.out.println("Entering run");
        Handler h=new Handler();

        h.post(new Runnable() {

            public void run() {

                // TODO Auto-generated method stub
                runOnUiThread(new Runnable() {

                    public void run() {
                        // TODO Auto-generated method stub
                        Butgrp1.get(cnt).setChecked(true);
                        cnt=cnt+1;
                        if(cnt>4)
                            cnt=0;
                        if(cnt>0)
                        //  Butgrp1.get(cnt-1).setChecked(false);
                        System.out.println(cnt);
                    }
                });


            }
        });

        //rg.getChildAt(cnt).setPressed(true);

    }
},1000,2000);

I need to access a group of radio buttons on the ui and set it as checked at regular intervals, but i keep getting different errors, i realized i must use a handler, but its still not working...can anyone please tell me where i am going wrong....am a newbie and am trying out stuff to understand the working better...please help...

like image 258
Ajay Avatar asked Mar 16 '12 13:03

Ajay


2 Answers

You have to create the Handler in the UI Thread, i.e. in onCreate of your Activity.

Because you create it in the run method of a background thread, the handler will execute your code in that very same background thread.

You could also initialize your Handler directly:

public class MyActivity extends Activity{

    private Handler handler = new Handler();

    //more code
}

And then don't use runOnUIThread:

 handler.post(new Runnable() {
           public void run() {
                    // TODO Auto-generated method stub
                    Butgrp1.get(cnt).setChecked(true);
                    cnt=cnt+1;
                    if(cnt>4)
                        cnt=0;
                    if(cnt>0)
                    //  Butgrp1.get(cnt-1).setChecked(false);
                    System.out.println(cnt);
                }
            });

EDIT: Ok try this cleaned up code. Because you did not post your full Activity this won't work out of the box:

public class TestActivity extends Activity {

    private Button button;
    static int cnt=0;
    public ArrayList<RadioButton> buttonArray = new ArrayList<RadioButton>();
    private Timer timer = new Timer(); 

    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                timer.schedule(new MyTimerTask(), 1000,2000);
            }
        });
    }


    private void doButtonStuff(){
        buttonArray.get(cnt).setChecked(true);
        cnt=cnt+1;
        if(cnt>4){
            cnt=0;
        }
        if(cnt>0){
            //  Butgrp1.get(cnt-1).setChecked(false);
            System.out.println(cnt);
        }
    }

    private class MyTimerTask extends TimerTask{

        @Override
        public void run() {        
            runOnUiThread(new Runnable() {              
                @Override
                public void run() {
                    doButtonStuff();
                }
            });
        }       
    }
}
like image 110
thaussma Avatar answered Oct 14 '22 22:10

thaussma


You can pass the Activity as a parameter to the method that runs the timertask, and then you can use Activity.runOnUiThread to execute your tasks in UI Thread. There are lots of post in stackoverflow site regarding the usage of runOnUiThread usage.

like image 22
Navine Avatar answered Oct 14 '22 22:10

Navine