2014-01-25 3 views
0

나는 "Looper.prepare()"를 호출하지 않은 스레드 내부에서 처리기를 만들 수 없다는 예외를주는 표면보기 스레드 (메인 스레드가 아닌)에서 카운트 다운하려고하는 카운트 다운 타이머를 가지고 있습니다. . 다른 답변을 보면 처리기를 사용하여 문제를 해결한다고 말합니다 (어떤 액티비티에 대한 액세스 권한이 없기 때문에 runonUIthread를 실제로 사용할 수 없습니다).게임 루프 문제가있는 안드로이드 countdowntimer

제 질문은 아래 코드가 작업자 스레드에서 예상대로 실행되도록하기 위해 정확히 어떻게 처리기를 사용합니까?

new CountDownTimer(30000, 1000) { 
     public void onTick(long millisUntilFinished) 
     { 
      Log.e("TEST", ""+millisUntilFinished/1000); 
      message = ("seconds remaining: " + millisUntilFinished/1000); 
     } 

     public void onFinish() 
     { 
      message = "finished"; 
      } 
    }.start(); 

답변

0

당신은 핸들러를 결합 할 수 있습니다 (컨텍스트를 들어 내가 따라서 작업자 스레드를 해제하고, 카운트 다운 타이머의 모든 틱에서 자신의 알파를 변경하여 서피스 뷰 SurfaceView 캔버스에 일부 그래픽을 렌더링하기 위해 노력하고 있어요) 및 작업자 스레드입니다. 메인 스레드에서 핸들러를 생성하고 UI 업데이트를 위해 워커 쓰레드에서 핸들러 참조를 사용한다. 작업자 스레드에서 메시지 및 업데이트 UI와

public final static int MSG_TICK = 0; 
    public final static int MSG_DONE = 1; 
    public final static String KEY_MSG = "message"; 

거래는

 final Handler handler = new Handler(handlerThread.getLooper()) { 

      @Override 
      public void handleMessage(Message msg) { 
       // TODO Auto-generated method stub 
       switch (msg.what) { 
       case MSG_TICK: 
        Bundle bundle = msg.getData(); 
        if (bundle != null) { 
         String content = bundle.getString(KEY_MSG); 
         // TODO: draw content 
        } 
        break; 
       case MSG_DONE: 
        // TODO: draw content 
        break; 
       } 
      } 

     }; 

메시지 보내기

 new Thread(new Runnable(){ 

      @Override 
      public void run() { 
       // TODO Auto-generated method stub 
       int seconds = 30; 
       String message = null; 
       while (seconds != 0) { 
        message = "seconds remaining: " + seconds; 
        Message msg = new Message(); 
        // what message 
        msg.what = MSG_TICK; 
        // set data 
        Bundle data = new Bundle(); 
        data.putString(KEY_MSG, message); 
        msg.setData(data); 

        handler.sendMessage(msg); 
        try { 
         Thread.sleep(1000); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
        --seconds; 
       } 

       message = "finished"; 
       handler.sendEmptyMessage(MSG_DONE); 
      } 

     }).start();