【问题标题】:Android: making 2 consecutive http requestsAndroid:发出 2 个连续的 http 请求
【发布时间】:2014-01-12 15:09:50
【问题描述】:

我从用户那里得到一个地址,我正在使用GeoCoder 来获取纬度/经度。

获得 lat/lng 后,我需要向我的服务器发送一个 POST 请求以保存数据(使用 Volley)。

我在 AsyncTask 中运行 GeoCoder 请求,并在 onPostExecute 回调中运行 post 请求。

这是正确的方法还是有更好的方法?

这是我的代码:

private class GeoCoderAsync extends AsyncTask<String, Void, List<Address>>{

        @Override
        protected List<Address> doInBackground(String... params) {
            String address = params[0];
            List<Address> addresses = null;
            Geocoder coder = new Geocoder(Favorites.this);
            try {
                addresses = coder.getFromLocationName(address, 1);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return addresses;
        }

        @Override
        protected void onPostExecute(List<Address> result) {
            Utils.dismissDialog(progDialog);
            if (result != null) {
                Address address = result.get(0);
                ...
                //this makes a post request
                VolleyHelper.post(request,AppConstants.URL.FAVORITES, getFavoritesSuccess(), getFavoritesError(), progDialog);
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            else{
                Log.d(TAG, "Got Nothing!!!");
            }

        }

    }

【问题讨论】:

  • 这段代码中连续的2个http请求在哪里?我只看到一个!
  • @Lefteris - VolleyHelper.post(request,AppConstants.URL.FAVORITES, getFavoritesSuccess(), getFavoritesError(), progDialog);
  • 这是我看到的请求。第二个在哪里?
  • @Lefteris - GeoCoder.getFromLocationName() 实际上是在发出一个 http 请求
  • 好吧,您正在 postExecute 上运行 Volley 请求,这意味着第一个请求已经完成。所以据我所见,没有错

标签: android android-asynctask android-volley


【解决方案1】:

我很确定你的方式是最好的。正如您评论的那样,您需要等到 onPost 才能使用 volley ,所以没有办法绕过它。无论如何,volley 使用它自己的多线程,所以它不会锁定任何东西。

一般来说,由于无线电的电池成本,最好尽量减少 http 请求,但在这种情况下,它是应用功能的关键,因此无法绕过它。

顺便说一句,对于任何阅读此问题并对凌空抽射感兴趣的人-http://arnab.ch/blog/2013/08/asynchronous-http-requests-in-android-using-volley/

希望这会有所帮助;)

【讨论】:

    【解决方案2】:

    我在 AsyncTask 中运行 GeoCoder 请求并运行帖子 onPostExecute 回调中的请求。

    这是正确的做法吗

    不,因为onPostExecute 在主 ui 线程上运行。如果你这样做,那么 UI 将冻结,直到 Http 发布请求未完成。

    或者有更好的方法吗?

    在从Geocoder 获得addresses 后,从doInBackground 发出post 请求。

    【讨论】:

    • 我正在使用 Volley 库,所以帖子也在后台线程中运行
    • 我无法从doInBackground 运行它,因为它是异步的,我唯一知道地址列表已填满的时间是onPostExecute
    猜你喜欢
    • 2018-02-13
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 2018-01-28
    • 2016-09-05
    相关资源
    最近更新 更多