2013-03-03 29 views
0

我嘗試以下方法數據,試圖讓TextView的從模型更新:TextView中不會顯示已在模型(MVC)進行了更新

  1. TextChangeListeners - 錯誤
  2. 其他螺紋
  3. 的AsyncTask
  4. 新增的刷新按鈕,更新數據,我強迫點擊

情況如下:

  1. 標準線程運行,每秒鐘更新模型(MVC)對象,完美工作。
  2. 當Model對象更新時,它會通知實現「Observer」的所有類。
  3. 我的GolfHomeScreen擴展了Activity並實現了Observer(代碼如下)。
  4. GolfHomeScreen.update(Observable observable,Object data)方法完美。它按預期每秒執行一次,S.O.P執行正確的數據(請參閱 - > // *#1 *)。
  5. 然後這會啓動一個線程。我在這個網站上讀到,你必須使用UI Thread來執行更新小部件的代碼,然後運行「runOnUiThread」方法 - 代碼看起來像我在下面所做的,但我發現它有點難以遵循。無論如何,此線程運行(請參閱 - > // *#2 )然後執行onClick(View v)方法(請參閱 - > // #3 *)。
  6. System.out.println("driverType :" + mvcModel.getDriverName());(參見 - > // *#4 *)完美地工作。
  7. // *#5 * - 它必須更新,但不是。
  8. 如果我實際上點擊了按鈕,數據將正確顯示在屏幕上。我唯一的猜測是屏幕不能刷新強制點擊,否則我不使用UI線程進行更新。

注意:如果下面的代碼丟失了一些東西,這是因爲我刪除了大量的代碼來簡化對正在發生的事情的理解。

public class GolfHomeScreen extends Activity implements Observer 
{ 
    GolfHomeScreen golfHomeScreen = null; 
    TextView driverName = null; // Type of driver used by golfer (eg: 1 wood) 
    Button refreshData = null; 

    @Override public void onClick(View v) //*** #3 *** 
    { 
    if ((v.getId()) == 12345) // ID of wood (12345 = 1 wood) 
    { 
        //*** #4 *** 
     System.out.println("driverType    :" + mvcModel.getDriverName()); //THIS PRINTS OUT THE LATEST DATA!!! 

        //*** #5 *** 
        driverName.setText(String.valueOf(mvcModel.getDriverName())); //THIS DOESN'T AFFECT THE SCREEN?? WHY :-(
    } 
    } 

    @Override public void onCreate(Bundle savedInstanceState) 
    { 
    golfHomeScreen = this; 
    refreshData = indViewById(R.id.golfhomescreen_button_refreshData); 
    driverName = (TextView) findViewById(R.id.golfhomescreen_text_drivername); 
    } 

    @Override public void update(Observable observable, Object data) 
    { 
    // #1 *** 
    System.out.println("driverType    :" + mvcModel.getDriverName()); 

    golfHomeScreen.runOnUiThread(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      refreshData.performClick(); //*** #2 *** 
     } 
    }); 
    } 

}

回答

2

我要跑了一些建議和一些修正,希望您的問題將不復存在。 我說,因爲從概念上講,你確實有一些錯誤的東西,我的答案是一種固定這些概念:

  • 刪除GolfHomeScreen golfHomeScreen = null;golfHomeScreen = this;你並不需要一個對象引用本身。這只是讓人困惑。這行golfHomeScreen.runOnUiThread(new Runnable()你應該只是打電話runOnUiThread(new Runnable()
  • 更改System.out.pr***Log.d(TAG, MESSAGE);這只是因爲這是Android專門的轉儲日誌的方式,它不會影響你的結果。它比標準的Java System.out更好,因爲它允許你通過TAG和嚴重性過濾這些日誌。
  • 千萬不要撥打refreshData.performClick();或其他類似的東西,因爲您希望執行該按鈕內的操作。如果您希望某個事情發生在多個來源上,請創建一個方法doThatThing(),將操作放在那裏,然後從ClickUpdate中調用該方法。你所做的事情有點像是「Rube Goldberg機器」,它正在更新某些內容,點擊一個按鈕來更改文本。只要改變文字。
  • 從不比較視圖ID與數字if ((v.getId()) == 12345)從XML創建的視圖的ID由系統在編譯過程中生成,並且您無法知道它是否爲固定數字。您應該與該視圖的靜態int ID進行比較,如下所示:if(v.getId() == R.id.golfhomescreen_text_drivername)。如果視圖是不是在XML創建(這是不是這裏的情況),你可以用實際的對象if(v.equals(driverName))

與這些變化相比較,我相信你的代碼將工作。如果確實如此,請確保讓我知道並標記爲正確的答案。

+0

嗨Budius,它沒有工作。以下 – user2082983 2013-03-04 18:54:53

+0

忽略上面的評論 - 我需要充分測試它正確,我運行在一箇舊的筆記本電腦在莫,並不能正確地測試它,但它' D看起來不會工作!當我回到我的dec機器時,我會稍後再報告一次! – user2082983 2013-03-04 19:06:34

+0

它不工作 - 我已經改變了我的架構,因爲它變得太複雜了! 我固執己見!感謝您的迴應 – user2082983 2013-03-14 13:46:11