Как правильно связать меняющиеся данные из AsyncTask с TextView в моей деятельности - PullRequest
1 голос
/ 08 ноября 2011

Допустим, у меня есть Activity, который отображает View, содержащий TextView.Мой Activity также имеет AsyncTask (работает непрерывно), который извлекает данные (изменяющееся значение) с веб-сервера каждую секунду или около того.Я хочу отслеживать данные с веб-сервера, отображая их в TextView.

. До сих пор я всегда просил, чтобы мой AsyncTask сделал setText в onProgressUpdate, поэтому мойДисплей TextView обновляется каждый раз, когда я получаю новые данные ... есть ли лучший способ?

Спасибо, что читаете меня.

PS: В конце концов у меня будетпо крайней мере две операции, каждая из которых имеет AsyncTask ранее описанного сорта.

Ответы [ 2 ]

2 голосов
/ 08 ноября 2011

Если вы хотите разделить данные и отобразить немного больше, вы можете следовать шаблону слушателя:

Заставьте свою деятельность реализовать новый интерфейс - что-то вроде:

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;
        }
    }

Ваша активность контролирует пользовательский интерфейс, AsyncTask загружает и уведомляет, когда что-то обновляется.

1 голос
/ 08 ноября 2011

Что ж, если извлеченные данные изменились по сравнению с драгоценно извлеченными, текст TextView также должен измениться (и поэтому вам нужно вызвать метод setText).Вы можете сохранить последние данные и сравнить новые данные с последними onProgressUpdate, чтобы изменить текст TextView только при необходимости.Тест может быть выполнен с любым алгоритмом сопоставления строк, например.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...