gpt4 book ai didi

Android:使用AsyncTask 进行重复Ajax 调用的含义

转载 作者:行者123 更新时间:2023-11-29 02:12:22 25 4
gpt4 key购买 nike

我需要我的 Android 应用程序使用 AJAX 调用定期从服务器获取数据,并相应地更新 UI(只是一堆需要使用 setText() 更新的 TextView )。请注意,这涉及 2 个任务:

  1. 进行 AJAX 调用,并在收到响应后更新 UI - 我为此使用了一个简单的 AsyncTask
  2. 定期重复执行上述操作。

我还没有想出一个优雅的方法来实现上面的第 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<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
);
}
  1. 我在使用它时是否应该注意任何反面?特别是,我看到 LogCat 中发生了很多 GC。另外,我想知道除非 onPostExecute() 完成,否则 AsyncTask 如何成为 GC 的候选对象?

  2. 如何“停止”更新?我想到的一种方法是将第一个 AsyncTask 实例作为 Activity 的成员变量。这样,我就可以对其调用 cancel(true) 并希望这会“停止”任务。


解决方案:

如果有人正在寻找类似的东西 - 我在这里提到的解决方案都不能令人满意。他们都遇到了 OutOfMemory 问题。我没有调试 OOM 的细节,但我怀疑这可能是因为递归,或者是因为将与 HTTP 相关的对象作为 AsyncTask 中的成员变量而不是作为Activity(主要是因为没有重用 HTTP 和其他对象)。

我放弃了这种方法,改用另一种方法 - 在我的 AsyncTaskdoInBackground() 中无休止地进行 Ajax 调用;并在 onProgressUpdate() 中更新 UI。这样我也避免了为更新 UI 维护太多线程或 Handler 的开销(记住 UI 可以在 onProgressUpdate() 中更新)。

这种方法还消除了对 TimerTimerTask 的需要,转而使用 Thread.sleep()This thread on SO还有更多详细信息和代码 fragment 。

最佳答案

在任何 View 上调用 postDelayed() 以安排大量代码在一定延迟后在主应用程序线程上运行。在 AsyncTaskonPostExecute() 中执行此操作以创建并执行另一个 AsyncTask

您可以使用 AlarmManager,正如其他人所引用的那样,但我同意您的看法,对于纯粹发生在 Activity 中的计时,感觉有点矫枉过正。

也就是说,如果无论 Activity 是否存在都应该发生 AJAX 调用,一定要考虑切换到 AlarmManagerIntentService

关于Android:使用AsyncTask 进行重复Ajax 调用的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6534824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com