2012-03-16 31 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); 

Tôi cần truy cập nhóm nút radio trên ui và đặt nó ở chế độ kiểm tra định kỳ, nhưng tôi vẫn gặp phải các lỗi khác nhau, tôi nhận ra rằng tôi phải sử dụng trình xử lý, nhưng nó vẫn không hoạt động ... bất cứ ai có thể vui lòng cho tôi biết nơi tôi đang đi sai .... là một newbie và đang cố gắng hiểu công việc tốt hơn ... xin vui lòng giúp đỡ ...Android: Truy cập phần tử giao diện người dùng từ chuỗi hẹn giờ

+0

Bạn có thể đăng một số lỗi bạn đang thấy không? –

Trả lời

20

Bạn cần phải tạo ra các Handler trong UI Chủ đề, ví dụ: trong onCreate của Activity của bạn.

Vì bạn tạo nó trong phương pháp run của một chuỗi nền, trình xử lý sẽ thực thi mã của bạn trong cùng một chuỗi nền đó.

Bạn cũng có thể khởi tạo của bạn Handler trực tiếp:

public class MyActivity extends Activity{ 

    private Handler handler = new Handler(); 

    //more code 
} 

Và sau đó không sử dụng 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 thử dọn dẹp mã này. Bởi vì bạn không gửi đầy đủ của bạn Hoạt động này sẽ không làm việc ra khỏi hộp:

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

Cảm ơn bạn đã trả lời, tôi đã làm những gì bạn yêu cầu tôi làm điều đó vào vòng lặp, nhưng một lần nút được truy cập nó chấm dứt đưa ra lỗi sau Thiệt hại ngoại lệ-Timer 0 E/AndroidRuntime (407): android.view.ViewRoot $ CalledFromWrongThreadException: Chỉ chuỗi ban đầu tạo phân cấp khung nhìn mới có thể chạm vào chế độ xem của nó. – Ajay

+1

@Ajay Bạn cần đảm bảo rằng bạn tạo trình xử lý của mình từ chuỗi giao diện người dùng thì bạn tốt – wnafee

+0

@wnafee Tôi đã tạo nó từ chuỗi ui, vẫn còn i gt lỗi, tôi có cảm giác rằng tôi không triển khai hẹn giờ công việc chính xác – Ajay

0

Bạn don ' t cần gọi runOnUIThread bên trong trình xử lý. Bằng cách gọi bài đăng trên phiên bản Handler, runnable bạn vượt qua sẽ được thực hiện trên luồng giao diện người dùng tại một số điểm trong tương lai. Thay đổi mã của bạn trông như thế này và nó sẽ làm việc:

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

Cảm ơn bạn đã trả lời, tôi đã làm những gì bạn yêu cầu tôi làm điều đó vào vòng lặp, nhưng một khi nút được truy cập nó chấm dứt cho lỗi sau đây – Ajay

0

Bạn có thể vượt qua các Hoạt động như một tham số cho phương thức mà chạy TimerTask, và sau đó bạn có thể sử dụng để Activity.runOnUiThread thực hiện các tác vụ của bạn trong Giao diện người dùng. Có rất nhiều bài đăng trong trang web stackoverflow liên quan đến việc sử dụng runOnUiThread sử dụng.

Các vấn đề liên quan