我需要我的Android应用程序使用AJAX调用定期从服务器获取数据,并相应地更新UI(只需要使用setText()更新一堆TextView)。
请注意,这涉及两项任务:
- 进行AJAX调用,并在收到响应后更新UI - 我使用了一个简单的AsyncTask。
- 定期重复上述操作。
我不确定重复调用AsyncTask的下列两种方法中哪一种更适合更好的性能。
方法1:从 onCreate 方法内部重复调用execute(),但我认为使用此方法的问题是在完成一个AsyncTask请求之前,另一个AsynTask请求可能会到来(如果请求的处理时间超过了调度延迟时间),并且队列中可能存在许多请求的可能性,这最终可能会损害性能。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_display_list_view);
final Handler handler = new Handler();
Timer timer = new Timer();
TimerTask doAsynchronousTask = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
public void run() {
try {
new AjaxRequestTask().execute(); // Async Call
} catch (Exception e) {
// TODO Auto-generated catch block
}
}
});
}
};
timer.schedule(doAsynchronousTask, 0, 2000); //execute in every 2000 ms
}
方法2:从 onPostExecute 内部重复调用execute(),但我认为使用此方法的问题将是递归,并且在每次调用AjaxRequestTask的新对象时都会在旧版本被销毁之前创建,并且会出现大量AsynTask对象存在于内存中的情况,最终会损害性能。
protected void onPostExecute(String result) {
final Handler handler = new Handler();
Timer timer = new Timer();
TimerTask doAsynchronousTask = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
public void run() {
try {
new AjaxRequestTask.execute(); // Async Call
} catch (Exception e) {
// TODO Auto-generated catch block
}
}
});
}
};
timer.schedule(doAsynchronousTask, 0, 2000);
}
答案 0 :(得分:0)
AsyncTask.execute
按顺序运行,即每当您使用AsyncTask.execute
时,您的工作线程将添加到队列中,这意味着您必须等待先前添加的任务(FIFO)的完成。
使用AsyncTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, params)
这将创建一个并行的AsyncTask
,您不必等待。
在您的情况下,您可以创建ThreadPoolExecutor
或ExecutorService
来限制AsyncTask
或Runnable
的数量。
您可以通过创建池执行程序
来完成此操作ExecutorService yourCustomPoolExector = Executors.newFixedThreadPool(5); // 5 is max number of tasks
AjaxRequestTask.executeOnExecutor(yourCustomPoolExector, params);
您可以随时致电yourCustomPoolExector.shutdownNow
取消所有AjaxRequestTask
。
如果您想定期执行所需的功能,可以考虑Sync Adapter
(但我认为您不需要使用此功能)。
答案 1 :(得分:0)
对于重复任务,您在后台RxJava库中提出请求是一个更好的解决方案。使用RxJava 1,它看起来像:
Subscription repeatingTask =
Observable.interval(10, TimeUnit.SECONDS)
.observeOn(Schedulers.computation())
.map(t -> {
// make your request here, it is done on background thread already
Response r = makeRequest();
return r;
})
// process result on a main thread
.observeOn(AndroidSchedulers.mainThread())
.subscribe (r -> {
processResponse(r);
},
e -> {
processError(e);
};
不再需要时取消该任务
if (null != repeatingTask && !repeatingTask.isUnsubscribed()) { repeatingTask.unsubscribe(); repeatingTask = null; {