假设我有Activity
,其中显示的View
包含TextView
。
我的Activity
也有一个AsyncTask
(连续运行),它每隔一秒左右从Web服务器检索一次数据(一个不断变化的值)。
我想要的是通过在TextView
。
到目前为止,我总是要求我的AsyncTask
执行setText
中的onProgressUpdate
,因此每次获取新数据时都会刷新TextView
的显示内容。有更好的方法吗?
感谢您阅读。
PS:最后,我将至少有两个活动,两个活动都有前面描述的AsyncTask。
答案 0 :(得分:2)
如果你想分开数据并多显示一下,你可以遵循一个监听模式:
让您的Activity实现一个新界面 - 例如:
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下载并在更新内容时通知。
答案 1 :(得分:1)
好吧,如果获取的数据从获取的内容中发生了变化,TextView
的文本也应该更改(因此您必须调用setText
方法)。您可以存储最后一个数据并针对最后一个onProgressUpdate
测试新数据,这样您只需在必要时更改TextView
的文本。例如,可以使用任何字符串匹配算法完成测试。