【问题标题】:Android: Better way to use AsyncTask to make repeated Ajax CallsAndroid:使用 AsyncTask 进行重复 Ajax 调用的更好方法
【发布时间】:2017-02-06 17:58:28
【问题描述】:

我需要我的 Android 应用定期使用 AJAX 调用从服务器获取数据,并相应地更新 UI(只是一堆需要使用 setText() 更新的 TextView)。

请注意,这涉及 2 个任务:

- 进行 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);


 }

【问题讨论】:

    标签: android ajax timer android-asynctask timertask


    【解决方案1】:

    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(但我认为你不需要使用它)。

    【讨论】:

      【解决方案2】:

      对于重复任务和在后台 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; {
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-01
        • 1970-01-01
        • 2015-07-04
        • 1970-01-01
        • 1970-01-01
        • 2015-12-27
        相关资源
        最近更新 更多