2012-04-25 5 views
1

以下のコードを実行するonCreateメソッドがあります。簡単に言えば、コードはサーバーからデータを取得し、それをメッセージングプログラム用の画面に表示します。これは一度だけ行いますが、私はそれを(チャットをシミュレートしようとするために)3秒ごとにAsyncTaskを実行したいと思います。私はこれがチャットシステムを持つ方法ではないと確信していますが、私は今のところ(概念の証明として)役立つものを必要とし、後でそれを実装する正しい方法に焦点を当てます。AsyncTaskを繰り返し実行するにはどうすればよいですか?

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.chat_box);// sd 

     final Functions function = new Functions(); 
     final SharedPreferences prefs = PreferenceManager 
       .getDefaultSharedPreferences(getBaseContext()); 
     whatroom = prefs.getString("chat", "null"); 

     new AsyncTask<String, Void, String>() { 
      @Override 
      protected String doInBackground(String... args) { 
       return function.getInbox(args[0]); 
      } 

      @Override 
      protected void onPostExecute(String result) { 
       TextView inbox = (TextView) findViewById(R.id.inbox); 
       ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar1); 
       progressBar.setVisibility(View.GONE); 
       inbox.setText(result); 
      } 

     }.execute(whatroom); 
    } 

シンプルなwhile文をasynctaskの周りに置こうとしましたが、強制的に閉じます。

+0

問題は何ですか? –

+1

私は通常、定期的なタスクのためのAsyncTaskを使用しないで、私の答えをチェックアウト[ここ](http://stackoverflow.com/questions/8098806/where-do-i-create-and-use-scheduledthreadpoolexecutor-timertask-or-ハンドラ/ 8102488#8102488)をご覧ください。 – yorkw

+0

ヨーク、あなたの答えは完璧だった。それは私のために働いて、私がそれが必要なすべてをやった。 – EGHDK

答えて

2

AsyncTaskインスタンスを再利用することはできません。ループを1回通過するごとに新しいインスタンスを作成する必要があります。

+0

新鮮なインスタンスを作成しようとするのは苦労でしょうか、別のルート(@Steveで言及されたローダーのようなもの)に行くべきですか? – EGHDK

+0

@EGHDK:これは私にとって「ローダー」シナリオのようには感じられません。あなたの 'TextView'で' Timer'と 'TimerTask'と' post() 'を使って、それらの更新をタスクのスレッドではなくメインのアプリケーションスレッドで発生させることができます。 – CommonsWare

+0

誰かがこれを将来見つけたら。 CommonsWareは質問に答えましたが、yorkwは私に解決策を与えました。あなたのお時間をありがとうございました。それは有り難いです。 – EGHDK

0

追加情報がない場合は、具体的な回答をすることは困難です。しかしLoadersについてなど

Serviceを使用して、Loaderを使用して、すべてを抽象化するに見て:

  • 彼らはすべての活動およびフラグメントにご利用いただけます。
  • これらは、データの非同期ロードを提供します。
  • コンテンツの変更時にデータの送信元を監視し、新しい結果を提供します。
  • 構成変更後に再作成されると、最後のローダのカーソルに自動的に再接続します。したがって、データを再クエリする必要はありません。
+0

asyncTaskは、単にPHPのスクリプトを使用してWebから情報を取得する関数 'getInbox()'を実行します。このためにローダーを使用するのは適切でしょうか? – EGHDK