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のラジオボタンのグループにアクセスし、定期的にチェックするように設定する必要がありますが、さまざまなエラーが発生し続けます。ハンドラーを使用する必要があることに気付きましたが、それでも機能しません...誰にも教えてもらえますか私は間違っています...初心者であり、作業をよりよく理解するために何かを試みています...助けてください...
Handler
は、UIスレッド内、つまり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);
}
});
編集:Okこのクリーンアップされたコードを試してください。アクティビティ全体を投稿していないため、これはそのままでは機能しません:
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);
}
});
Timertaskを実行するメソッドにパラメーターとしてActivityを渡すことができます。次に、Activity.runOnUiThreadを使用して、UIスレッドでタスクを実行できます。 runOnUiThreadの使用方法については、stackoverflowサイトに多くの投稿があります。