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);
我需要访问ui上的一组单选按钮,并定期将其设置为选中状态,但我不断收到不同的错误,我意识到我必须使用处理程序,但它仍然无法工作…有人能告诉我哪里出了问题吗…我是一名新手,正在尝试更好地理解工作原理的东西…请帮助…你不知道吗不需要在处理程序内调用runOnUIThread。通过在处理程序实例上调用post,您传递的runnable将在将来某个时候在UI线程上执行。将代码更改为如下所示,它应该可以工作: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
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();
}
});
}
}
}