2011-11-08 4 views
1

ActivityにはTextViewを含むViewが表示されています。 私のActivityには、1秒おきにWebサーバーからデータ(変更値)を取得するAsyncTask(継続的に実行中)もあります。 私が望むのは、WebサーバーからのデータをTextViewに表示して監視することです。AsyncTaskのデータの変更をアクティビティ内のTextViewに正しくリンクするには

これまでのところ、私はいつも私のTextViewの表示が、私は新しいデータを取得するたびに更新されるので、onProgressUpdatesetTextを行うには、私のAsyncTaskを頼む...良い方法はありますか?

私を読んでくれてありがとう。

PS:最後に、前述の種類のAsyncTaskを持つ少なくとも2つのアクティビティがあります。

+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メソッドを呼び出す必要があります)。最後のデータを保存し、新しいデータを最後のものと比較してテストすることができます。TextViewのテキストは必要に応じて変更するだけです。テストは、たとえば、任意の文字列マッチングアルゴリズムで実行できます。

+0

ありがとうAlesqui。私の質問は明確ではありませんでした。あなたは私がやっていることを正確に記述しています:onProgressUpdateからsetTextを呼び出します。私が知りたいのは、データをフェッチしてデータを表示するよりも、よりOOP的な方法でそれを行う方法があることです。 – mthpvg

+1

さて、TextViewとその他のUIコンポーネントを保持するクラスを作成し、このクラスにTextViewのテキストが変更されたことを通知するメソッドを作成できます。 fetcherクラスはUIクラスにデータ変更についてのみ通知しますが、情報を処理するのはUIクラスになります。 1つのUIクラスしか望んでいないので、シングルトンを使用することもできます...それはあなたが望むものかどうかわかりませんが、うまくいくでしょう:) – Alesqui

関連する問題