Android:使用AsyncTask进行重复Ajax调用的更好方法

时间:2017-02-06 17:58:29

标签: android ajax timer android-asynctask timertask

我需要我的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);


 }

2 个答案:

答案 0 :(得分:0)

AsyncTask.execute按顺序运行,即每当您使用AsyncTask.execute时,您的工作线程将添加到队列中,这意味着您必须等待先前添加的任务(FIFO)的完成。 使用AsyncTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, params)这将创建一个并行的AsyncTask,您不必等待。

在您的情况下,您可以创建ThreadPoolExecutorExecutorService来限制AsyncTaskRunnable的数量。

您可以通过创建池执行程序

来完成此操作
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; {