Android:从计时器线程访问UI元素

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); 

我需要访问ui上的一组单选button,并定期检查,但我不断收到不同的错误,我意识到我必须使用处理程序,但它仍然不工作…任何人都可以告诉我在哪里我要错了….是一个新手,并尝试了解的东西更好地工作…请帮助…

Related of "Android:从计时器线程访问UI元素"

您必须在UI线程中创buildHandler ,即在您的Activity onCreate

因为你在后台线程的run方法中创build它,所以处理程序将在同一个后台线程中执行你的代码。

你也可以直接初始化你的Handler

 public class MyActivity extends Activity{ private Handler handler = new Handler(); //more code } 

然后不要使用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); } }); 

编辑:好的尝试这个清理的代码。 由于您没有发布完整的活动,因此无法正常工作:

 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(); } }); } } } 

您不需要在处理程序中调用runOnUIThread。 通过在Handler实例上调用post,您传递的runnable将在将来的某个时刻在UI线程上执行。 改变你的代码看起来像这样,它应该工作:

  Handler h=new Handler(); h.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); } }); 

您可以将Activity作为parameter passing给运行timertask的方法,然后您可以使用Activity.runOnUiThread在UI Thread中执行您的任务。 关于runOnUiThread用法的使用,在stackoverflow站点有很多post。