我需要我的Android应用程序使用AJAX调用定期从服务器获取数据,并相应地更新UI(只是一堆需要使用setText()更新的TextViews).请注意,这涉及2个任务:
>进行AJAX调用,并在收到响应后更新UI-为此,我使用了一个简单的AsyncTask.
>定期重复上述操作.
我还没有找到实现上述第2点的优雅方法.当前,我只是从OnPostExecute()执行任务本身.我在this thread at 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 {
@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.另外,我想知道除非onPostExecute()完成,否则AsyncTask如何成为GC的候选对象?
>如何“停止”更新?我想到的一种方法是将第一个AsyncTask实例作为Activity的成员变量.这样,我可以在其上调用cancel(true),并希望这将“停止”任务.
解:
万一有人在寻找类似的东西-我在这里提到的解决方案都不能令人满意地工作.他们都遭受内存不足的问题.我没有调试OOM的详细信息,但我怀疑这可能是由于递归,还是因为与HTTP相关的对象作为AsyncTask中的成员变量而不是Activity的成员(基本上是因为未重用) HTTP和其他对象).
我放弃了这种方法,将其用于另一种方法-在AsyncTask的doInBackground()中无休止地进行Ajax调用;并在onProgressUpdate()中更新UI.这样,我还避免了维护太多线程或处理程序以更新UI的开销(记住UI可以在onProgressUpdate()中进行更新).
这种方法还消除了对Timers和TimerTasks的需求,而改为使用Thread.sleep(). This thread on SO还有更多详细信息和代码段.