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);
Мне нужно получить доступ к группе переключателей в пользовательском интерфейсе и установить его как проверено через регулярные промежутки времени, но я продолжаю получать разные ошибки, я понял, что должен использовать обработчик, но он все еще не работает...может кто-нибудь, пожалуйста, скажите мне, где я ошибаюсь....я новичок и пробую вещи, чтобы лучше понять работу...пожалуйста помочь...
3 ответов
вы должны создать Handler
в потоке пользовательского интерфейса, т. е. в onCreate
вашего Activity
.
потому что вы создаете ее в run
метод фонового потока, обработчик будет выполнять ваш код в том же самом фоновом потоке.
вы также можете инициализировать свой 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 внутри обработчика. Вызывая post на экземпляре обработчика, Runnable, который вы передаете, будет выполнен в потоке пользовательского интерфейса в какой-то момент в будущем. Измените свой код, чтобы он выглядел так, и он должен работать:
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);
}
});
вы можете передать действие в качестве параметра методу, который запускает timertask, а затем вы можете использовать Activity.runOnUiThread для выполнения ваших задач в потоке пользовательского интерфейса. На сайте stackoverflow много сообщений об использовании runOnUiThread.