2014-01-25 130 views
0

我有一個倒計時計時器試圖倒計時從一個表面視圖線程(而不是主線程),它給出了一個異常「不能創建處理程序內部線程,沒有調用Looper.prepare()」 。看看他們說的使用處理程序解決問題的其他答案(我無法真正使用runonUIthread,因爲我無法訪問任何活動)。Android的倒計時器與遊戲循環問題

我的問題是,我如何使用處理程序,以允許下面的代碼按預期從工作線程運行?

(查看上下文我想通過在倒計時的每一個刻度改變他們的阿爾法呈現一些圖形到surfaceview畫布上,因此這樣做掉工作線程)

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

您可以將處理器和工作者線程。在主線程中創建處理程序,並在工作線程中使用處理程序引用進行UI更新。從工作線程

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

處理信息和更新UI

 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();