2011-11-08 13 views
1

假設我有一個Activity,它顯示一個包含TextViewView。 我的Activity也有一個AsyncTask(持續運行),它每秒鐘從Web服務器檢索數據(變化的值)。 我想要的是通過在TextView中顯示來監視來自Web服務器的數據。如何正確地將變化數據從AsyncTask鏈接到我的活動中的TextView中

到目前爲止,我總是問我AsyncTask做的onProgressUpdatesetText,所以我TextView的顯示刷新每次我得到新的數據時,...有沒有更好的辦法?

感謝您的閱讀。 PS:最後,我將至少有兩個活動,都有一個AsyncTask的前述品種。

+2

「......有沒有更好的辦法?」這種方式有什麼問題? –

+0

將UI的操作與數據處理分開不是一種更好的做法嗎?就像試圖做模塊化編程一樣。 – mthpvg

回答

2

如果你想單獨數據並顯示多一點,你可以遵循一個監聽器模式:

讓您的活動實現了新的界面 - 是這樣的:

public interface boolean OnTextUpdatedListener { 
    onTextUpdated(int id, String newText); 
} 

和實施(在您的活動):

@Override 
public boolean onTextUpdated(int id, String newText) { 
    TextView tv = (TextView)findViewById(id); 
    if(tv == null) { 
    return false; 
    } 
    tv.setText(newText); 
    return true; 
} 

這看起來是這樣的一個的AsyncTask:

public class TextUpdater extends AsyncTask<Void, String, Void> { 
     OnTextUpdatedListener mListener; 
     int mId; 
     volatile boolean mRunning; 

      public TextUpdater(OnTextUpdatedListener listener, int id) { 
     super(); 
     mListener = listener; 
     mId = id; 
    } 

     @Override 
     protected void onProgressUpdate(String... values) { 
      mRunning = mListener.onTextUpdated(mId, values[0]); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      mRunning = true; 
      while(mRunning) { 
       //retrieve text from network 
       this.publishProgress(downloadedText); 
      } 

      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      mListener = null; 
     } 
    } 

您的活動保持對UI的控制,AsyncTask下載並在更新內容時通知。

+0

這正是我正在尋找的做法。非常感謝FunkTheMonk。 – mthpvg

1

那麼,如果提取的數據從珍貴的提取中改變了,那麼TextView的文本也應該改變(所以你必須調用setText方法)。您可以存儲最後的數據並對最後一個數據進行測試onProgressUpdate,以便在必要時僅更改TextView的文本。例如,測試可以使用任何字符串匹配算法完成。

+0

謝謝Alesqui。我的問題並不清楚。你正在描述我在做什麼:從onProgressUpdate調用setText。我想知道的是:有沒有辦法以更多的OOP方式來做到這一點,而不是讓班級獲取數據並顯示數據。 – mthpvg

+1

那麼,你可以創建一個類來容納TextView和其他UI組件,以及一個通知這個類TextView的文本改變的方法。 fetcher類只會通知UI類有關數據更改的內容,但它將是處理信息的UI類。你甚至可以使用Singleton,因爲你只需要一個UI類......我不知道這是你想要的,但它會工作,併成爲一個漂亮的代碼:) – Alesqui

相關問題