如何正确地将AsyncTask中的更改数据链接到我的Activity中的TextView

时间:2011-11-08 11:42:29

标签: android android-asynctask

假设我有Activity,其中显示的View包含TextView。 我的Activity也有一个AsyncTask(连续运行),它每隔一秒左右从Web服务器检索一次数据(一个不断变化的值)。 我想要的是通过在TextView

中显示来监控来自Web服务器的数据

到目前为止,我总是要求我的AsyncTask执行setText中的onProgressUpdate,因此每次获取新数据时都会刷新TextView的显示内容。有更好的方法吗?

感谢您阅读。

PS:最后,我将至少有两个活动,两个活动都有前面描述的AsyncTask。

2 个答案:

答案 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的文本。例如,可以使用任何字符串匹配算法完成测试。