首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android:从定时器线程访问UI元素

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

Stack Overflow用户
提问于 2012-03-16 21:35:20
回答 3查看 33.5K关注 0票数 23
代码语言:javascript
复制
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上的一组单选按钮,并将其设置为定期检查,但我不断收到不同的错误,我意识到我必须使用处理程序,但它仍然不working...can任何人请告诉我,我去哪里wrong....am一个新手,并正在尝试的东西,以了解工作的better...please帮助…

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-16 21:56:15

您必须在UI线程中创建Handler,即在ActivityonCreate中。

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

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

代码语言:javascript
复制
public class MyActivity extends Activity{

    private Handler handler = new Handler();

    //more code
}

然后不要使用runOnUIThread

代码语言:javascript
复制
 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);
                }
            });

编辑:好的,试试这段清理过的代码。因为你没有发布你的全部活动,这将不会开箱即用:

代码语言:javascript
复制
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();
                }
            });
        }       
    }
}
票数 25
EN

Stack Overflow用户

发布于 2014-09-30 19:51:36

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

票数 1
EN

Stack Overflow用户

发布于 2012-03-16 21:53:19

您不需要在处理程序内部调用runOnUIThread。通过在Handler实例上调用post,您传递的runnable将在将来的某个时候在UI线程上执行。将您的代码更改为如下所示,它应该可以工作:

代码语言:javascript
复制
 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);
                }
            });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9738239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档