Android:从计时器线程访问UI元素 公共按钮机顶盒; 静态int cnt=0; public ArrayList Butgrp1=新的ArrayList(); 定时器myt; 时间任务t; stb.setOnClickListener(新的OnClickListener(){ 公共void onClick(视图v){ myt.mschedule(新TimerTask(){ @凌驾 公开募捐{ //TODO自动生成的方法存根 System.out.println(“进入运行”); Handler h=新的Handler(); h、 post(新的Runnable(){ 公开募捐{ //TODO自动生成的方法存根 runOnUiThread(新的Runnable(){ 公开募捐{ //TODO自动生成的方法存根 Butgrp1.get(cnt).setChecked(true); cnt=cnt+1; 如果(cnt>4) cnt=0; 如果(cnt>0) //Butgrp1.get(cnt-1).setChecked(false); 系统输出打印项次(cnt); } }); } }); //rg.getChildAt(cnt).setPressed(true); } },1000,2000);

Android:从计时器线程访问UI元素 公共按钮机顶盒; 静态int cnt=0; public ArrayList Butgrp1=新的ArrayList(); 定时器myt; 时间任务t; stb.setOnClickListener(新的OnClickListener(){ 公共void onClick(视图v){ myt.mschedule(新TimerTask(){ @凌驾 公开募捐{ //TODO自动生成的方法存根 System.out.println(“进入运行”); Handler h=新的Handler(); h、 post(新的Runnable(){ 公开募捐{ //TODO自动生成的方法存根 runOnUiThread(新的Runnable(){ 公开募捐{ //TODO自动生成的方法存根 Butgrp1.get(cnt).setChecked(true); cnt=cnt+1; 如果(cnt>4) cnt=0; 如果(cnt>0) //Butgrp1.get(cnt-1).setChecked(false); 系统输出打印项次(cnt); } }); } }); //rg.getChildAt(cnt).setPressed(true); } },1000,2000);,android,timer,timertask,Android,Timer,Timertask,我需要访问ui上的一组单选按钮,并定期将其设置为选中状态,但我不断收到不同的错误,我意识到我必须使用处理程序,但它仍然无法工作…有人能告诉我哪里出了问题吗…我是一名新手,正在尝试更好地理解工作原理的东西…请帮助…你不知道吗不需要在处理程序内调用runOnUIThread。通过在处理程序实例上调用post,您传递的runnable将在将来某个时候在UI线程上执行。将代码更改为如下所示,它应该可以工作: public Button stb; static int cnt=0; public Arra

我需要访问ui上的一组单选按钮,并定期将其设置为选中状态,但我不断收到不同的错误,我意识到我必须使用处理程序,但它仍然无法工作…有人能告诉我哪里出了问题吗…我是一名新手,正在尝试更好地理解工作原理的东西…请帮助…

你不知道吗不需要在处理程序内调用runOnUIThread。通过在处理程序实例上调用post,您传递的runnable将在将来某个时候在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线程中创建
处理程序,即在
活动的
onCreate

因为您是在后台线程的
run
方法中创建的,所以处理程序将在同一后台线程中执行您的代码

您还可以直接初始化
处理程序

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

public class MyActivity extends Activity{

    private Handler handler = new Handler();

    //more code
}
编辑: 好的,请尝试此已清理的代码。因为您没有发布完整的活动,所以此操作无法开箱即用:

 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);
                }
            });
公共类测试活动扩展活动{
私人按钮;
静态int cnt=0;
public ArrayList buttonArray=new ArrayList();
专用计时器=新计时器();
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
timer.schedule(新的MyTimerTask(),10002000);
}
});
}
私有void dobuttonstaff(){
buttonArray.get(cnt.setChecked)(true);
cnt=cnt+1;
如果(cnt>4){
cnt=0;
}
如果(cnt>0){
//Butgrp1.get(cnt-1).setChecked(false);
系统输出打印项次(cnt);
}
}
私有类MyTimerTask扩展了TimerTask{
@凌驾
public void run(){
runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
多布顿凝灰岩();
}
});
}       
}
}

您可以将Activity作为参数传递给运行timertask的方法,然后您可以使用Activity.runOnUiThread在UI线程中执行任务。stackoverflow站点中有很多关于runOnUiThread用法的帖子。

您可以发布您看到的一些错误吗?感谢您的回复,我已经按照您的要求做了请让我做它进入循环,但一旦访问按钮,它就会终止,并给出以下错误感谢您的回复,我做了您要求我做的事情,它就会进入循环,但一旦访问按钮,它就会终止,并给出以下错误致命异常计时器0 E/AndroidRuntime(407):android.view.ViewRoot$CalledFromErrorThreadException:只有创建视图层次结构的原始线程才能接触其视图。@a可能您需要确保从UI线程创建处理程序,然后good@wnafee我确实是从ui线程创建的,但是我仍然忽略了错误,我感觉我没有实现计时器任务c正确地说它工作了!!非常感谢:)那么覆盖timertask运行方法工作了,你能解释一下它工作的原因吗?我仍然认为问题是处理程序不是在UI线程中创建的。现在已经没有处理程序了。我真的不能多说了,因为你没有发布整个活动。
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();
                }
            });
        }       
    }
}