2012-03-16 15 views
17
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のラジオボタンのグループにアクセスし、定期的にチェックを入れておく必要がありますが、別のエラーが発生しています。しかし、それでも動作していない...誰が私が間違っていると私に教えてください....初心者であり、より良い仕事を理解するために試しています...助けてください...Android:タイマースレッドからUI要素にアクセスする

+0

あなたが見ているエラーのいくつかを投稿できますか? –

答えて

20

あなたのActivityonCreateに、すなわち、UIスレッドでHandlerを作成する必要があります。

バックグラウンドスレッドの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); 
       } 
      }); 

EDIT: [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(); 
       } 
      }); 
     }  
    } 
} 
+0

返信ありがとう、私はあなたが私にそれをループボタンがアクセスされて終了し、次のエラーが発生します。 致命的な例外タイマー0 E/AndroidRuntime(407):android.view.ViewRoot $ CalledFromWrongThreadException:ビュー階層を作成した元のスレッドのみがビューにアクセスできます。 – Ajay

+1

@Ajay UIスレッドからあなたのハンドラを作成してから、あなたが良いことを確認する必要があります。 – wnafee

+0

@wnafee私はUIスレッドから作成しました。まだエラーがあります。私は私が実装していないと感じています。タイマーのタスクは正しく – Ajay

0

あなたは、ハンドラ内でrunOnUIThreadを呼び出す必要があります。 Handlerインスタンスでpostを呼び出すと、渡された実行ファイルは、将来のある時点で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); 
       } 
      }); 
+0

返信ありがとうございます、私はループに入るように頼んだものでしたが、一度ボタンにアクセスすると、次のエラーを返して終了します – Ajay

0

あなたはTimerTaskをを実行するメソッドのパラメータとしての活動を渡すことができ、その後、あなたはにActivity.runOnUiThreadを使用することができますUIスレッドでタスクを実行します。 runOnUiThreadの使い方については、stackoverflowサイトに多くの投稿があります。

関連する問題