AJAX呼び出しを使用してサーバーから定期的にデータを取得し、それに応じてUIを更新するには、Androidアプリが必要です(でTextView
更新する必要がある一連のsのみsetText()
)。これには 2 つのタスクが含まれることに注意してください。
- AJAX 呼び出しを行い、応答を受信したら UI を更新します。これには単純なを使用し
AsyncTask
ます。 - 上記を一定間隔で繰り返し行います。
上記のポイント 2 を達成するエレガントな方法がわかりません。現在、からタスク自体を実行しているだけですOnPostExecute()
。SO のこのスレッドを読みましたが、AsyncTask オブジェクトに関する限り、ガベージ コレクションについて心配する必要はありません。
しかし、期限が切れた後に AsyncTask を起動するタイマーをどのように設定するかについては、まだわかりません。任意のポインタをいただければ幸いです。これが私のコードです:
public class MyActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
new AjaxRequestTask().execute(MY_REST_API_URL);
}
private void updateReadings(String newReadings) {
//Update the UI
}
class AjaxRequestTask extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... restApiUrl) {
//Do AJAX Request
}
@Override
protected void onPostExecute(String result) {
updateReadings(result);
/*Is there a more elegant way to achieve this than create a new AsyncTask object every 10 seconds? Also, How can I update the UI if I create a timer here? */
new AjaxRequestTask().execute(MY_REST_API_URL);
}
}
}
前もって感謝します
編集:回答を投稿しようとしましたが、8時間以内に回答するという評判がないため、投稿できませんでした.
さて、私は解決策を見つけました。しかし、私は確信していません。
protected void onPostExecute(String result) {
updateReadings(result);
// super.onPostExecute(result);
new Timer().schedule(
new TimerTask() {
@Override
public void run() {
new AjaxRequestTask().execute(MY_REST_API_URL);
}
},
TIMER_ONE_TIME_EXECUTION_DELAY
);
}
これを使用する際に知っておくべき裏返しはありますか? 特に、LogCat で多くの GC が発生しています。また、が完了しない限り、どのよう
AsyncTask
にGCの候補になるのでしょうか?onPostExecute()
どうすれば更新を「停止」できますか? 私が考えた 1 つの方法は、最初の
AsyncTask
インスタンスを のメンバー変数として作成することでしたActivity
。そうすれば、それを呼び出しcancel(true)
て、これがタスクを「停止」することを期待できます。
解決策:
誰かが同様のものを探している場合に備えて、ここで言及した解決策はどれも満足に機能しません。彼らは皆、問題に苦しんでOutOfMemory
います。OOM の詳細についてはデバッグしませんでしたが、再帰が原因であるか、HTTP 関連のオブジェクトを のメンバーとしてではAsyncTask
なくメンバー変数として持つことが原因であると思われますActivity
(基本的には、HTTP を再利用せず、他のオブジェクト)。
私は別のアプローチのためにこのアプローチを破棄しましdoInBackground()
たAsyncTask
。で UI を更新しonProgressUpdate()
ます。そうすれば、UI を更新するためにあまりにも多くのスレッドまたは を維持することによるオーバーヘッドも回避Handler
できます (UI は で更新できることを思い出してonProgressUpdate()
ください)。
Timer
このアプローチではs とs の必要もなくなり、代わりTimerTask
に を使用することができThread.sleep()
ます。SO のこのスレッドには、詳細とコード スニペットもあります。