我需要我的 Android 应用程序使用 AJAX 调用定期从服务器获取数据,并相应地更新 UI(只是一堆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()?如何“停止”更新?我想到的一种方法是将第一个
AsyncTask实例作为Activity. 这样,我可以调用cancel(true)它并希望这将“停止”任务。
解决方案:
如果有人正在寻找类似的东西 - 我在这里提到的解决方案都不能令人满意。他们都饱受OutOfMemory问题之苦。我没有调试 OOM 的细节,但我怀疑这可能是因为递归,或者因为 HTTP 相关对象作为成员变量AsyncTask而不是成员Activity(基本上是因为没有重用 HTTP 和其他对象)。
我放弃了这种方法,换了一种方法——使我的 Ajax 调用无休止地出现在doInBackground()我的AsyncTask; 并在onProgressUpdate(). 这样我也避免了维护太多线程或Handler更新 UI 的开销(记住 UI 可以在 中更新onProgressUpdate())。
这种方法也消除了对Timers 和TimerTasks 的需要,而倾向于使用 of Thread.sleep()。SO上的这个线程也有更多细节和代码片段。