2015-09-14 52 views
1

我在Observer.update內嘗試setTextTextView時遇到問題。我試圖調試,它確實運行到更新功能中,但setText調用被忽略。無法更新Observer.update內的TextView

if (step.getMyTimer().countObservers() == 0){ 
       Observer ob = new Observer() { 
        @Override 
        public void update(Observable observable, Object data) { 
         timerTextView.setText(step.getMyTimer().toString()); 

         Log.v("INSIDE OBSERVER ", ""); 
        } 
       }; 

       step.getMyTimer().addObserver(ob); 
       Log.v("ADD OBSERVER :", ""); 
      } 

在logcat中,它沒有打印出INSIDE OBSERVER。 有人有什麼想法嗎?


於是,我就加入到Observer.update和定時器這樣的:

Observer ob = new Observer() { 
        @Override 
        public void update(Observable observable, Object data) { 



         Log.v("THREAD UPDATE OBSERVER ", ""+Looper.myLooper().getThread().getName()); 
        } 
       }; 

       step.getMyTimer().addObserver(ob); 
       Log.v("THREAD ADD OBSERVER :", "" + Looper.myLooper().getThread().getName()); 

在計時器:

_timer = new CountDownTimer(min * 60000, 1000) { 
      @Override 
      public void onTick(long millisUntilFinished) { 
       tick(); 
       setChanged(); 
       notifyObservers(); 
       clearChanged(); 
       Log.v("THREAD TIMER : ", "" + Looper.myLooper().getThread().getName()); 
      } 
... 
} 

這是輸出:

09-17 15:09:32.312 V/MAIN THREAD﹕ main--main 
09-17 15:09:32.544 V/THREAD ADD OBSERVER :﹕ main 
09-17 15:09:32.554 V/THREAD ADD OBSERVER :﹕ main 
09-17 15:09:38.703 V/THREAD UPDATE OBSERVER﹕ main 
09-17 15:09:38.703 V/THREAD TIMER :﹕ main 
09-17 15:09:39.705 V/THREAD UPDATE OBSERVER﹕ main 
09-17 15:09:39.705 V/THREAD TIMER :﹕ main 
09-17 15:09:40.706 V/THREAD UPDATE OBSERVER﹕ main 
09-17 15:09:40.706 V/THREAD TIMER :﹕ main 
09-17 15:09:41.707 V/THREAD UPDATE OBSERVER﹕ main 
09-17 15:09:41.707 V/THREAD TIMER :﹕ main 
+0

嘗試登錄'step.getMyTimer()。的toString()'值和檢查日誌 –

+0

什麼讓step.getMyTimer的'內容() .toString()'確實發生了變化,但仍不能'setText' –

+0

如何聲明timerTextView並在xml中定義佈局? – headuck

回答

0

它忽略,因爲你不是在做Ë主線程
必須使用post()方法

timerTextView.post(new Runnable() { 
     @Override 
     public void run() { 
      timerTextView.setText(step.getMyTimer().toString()); 
     } 
    }) 
+0

這是否意味着它會創建另一個線程,唯一的目的是更新'timerTextView'?如果是這樣,那麼我該如何終止這個線程? –

+0

@NguyenQuangAnh,不,runnable會在主線程中發佈,所以你不需要終止任何東西 – bananabastard

+0

等等,直到現在我還以爲普通的代碼(沒有線程,就像View.getView裏面或者觀察者代碼一樣)是總是在主線程上運行?比方說,我沒有爲觀察者創建任何其他線程,所以它基本上在主線程上運行,並且'update'方法也是,然後'TextView.setText'在此方法內,該方法在主線程上運行,然後爲什麼它沒有執行?然後我們必須使用'post'方法讓它在主線程上運行。你有沒有更多關於這個問題的文件?謝謝。 –