为什么异步方法会在Retrofit 2中更快地调用?

时间:2016-07-09 19:13:35

标签: android retrofit2 okhttp3

正如您在下面的代码中看到的,我调用getPostByPageId()方法从服务器获取数据,然后检查数据是否已返回,我还做其他工作。

 private void recyclerViewJobs() {
    getPostByPageId();
    if (pageDtoList.size() > 0) {
        emptyText.setVisibility(View.GONE);
        recyclerView.setVisibility(View.VISIBLE);
        PagesAdapter adapter = new PagesAdapter(pageDtoList, context);
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(context));
    } else {
        emptyText.setVisibility(View.VISIBLE);
        recyclerView.setVisibility(View.GONE);
    }


}

.....

private void getPostByPageId() {

    IPageEndPoint pageEndPoint = ServiceGenerator.createService(IPageEndPoint.class);
    Call<List<PageDto>> call = pageEndPoint.getPostByPageId(profileId);
    call.enqueue(new retrofit2.Callback<List<PageDto>>() {
        @Override
        public void onResponse(Call<List<PageDto>> call, Response<List<PageDto>> response) {
            if (response.isSuccessful()) {
                pageDtoList = response.body();
            } else {
                log.toast("response is not successful for getPostByPageId");
            }
        }

        @Override
        public void onFailure(Call<List<PageDto>> call, Throwable t) {
            log.toast("getPostByPageId onFailure");
        }
    });
}

我不知道为什么在recyclerViewJobs()方法中,if条件先工作?

  也许我不能很好地解释我的问题,但我的大问题是   知道什么时候我想从REST获取一些数据然后使用这些数据   另一个REST服务,我怎么能这样做,因为入队   改造工作异步,不要等待第一种方法,因为   它在另一个线程中开始第二个方法   因为我的数据还没有从第一种方法获得,我的程序是   坠毁了,我没有得到答案。那是我的问题.....

干杯

3 个答案:

答案 0 :(得分:3)

那是因为改造的enqueue方法不是阻塞方法。这意味着调用它的线程不会等待它完成它的工作。 就像@Amir所说的那样,如果你在调用getPostByPageId()后还有其他事情要做,你应该在改装回调之后把它们放进去:

    private void recyclerViewJobs() {
        getPostByPageId();
    }
    private void getPostByPageId() {

        IPageEndPoint pageEndPoint = ServiceGenerator.createService(IPageEndPoint.class);
        Call<List<PageDto>> call = pageEndPoint.getPostByPageId(profileId);
        call.enqueue(new retrofit2.Callback<List<PageDto>>() {
            @Override
            public void onResponse(Call<List<PageDto>> call, Response<List<PageDto>> response) {
                if (response.isSuccessful()) {
                    pageDtoList = response.body();
                    if (pageDtoList.size() > 0) {
                        emptyText.setVisibility(View.GONE);
                        recyclerView.setVisibility(View.VISIBLE);
                        PagesAdapter adapter = new PagesAdapter(pageDtoList, context);
                        recyclerView.setAdapter(adapter);
                        recyclerView.setLayoutManager(new LinearLayoutManager(context));
                    } else {
                        emptyText.setVisibility(View.VISIBLE);
                        recyclerView.setVisibility(View.GONE);
                    }
                } else {
                    log.toast("response is not successful for getPostByPageId");
                }
            }

            @Override
            public void onFailure(Call<List<PageDto>> call, Throwable t) {
                log.toast("getPostByPageId onFailure");
            }
        });
    }

答案 1 :(得分:1)

您的async call先跑但您的if-condition总是错误,因为if-condition的行为不符合您的预期!只要您async request发送了if-condition,就会检查public void onResponse(Call<List<PageDto>> call, Response<List<PageDto>> response) { if (response.body().YOUR_LIST.size() > 0) { emptyText.setVisibility(View.GONE); recyclerView.setVisibility(View.VISIBLE); PagesAdapter adapter = new PagesAdapter(pageDtoList, context); recyclerView.setAdapter(adapter); recyclerView.setLayoutManager(new LinearLayoutManager(context)); //CALL_YOUR_NEXT webservice here } else { emptyText.setVisibility(View.VISIBLE); recyclerView.setVisibility(View.GONE); } } 并且由于您的列表为空(您的服务器响应尚未提取),它始终会返回 false

如果您想在WebService响应成功后立即调用下一个操作,可以使用以下代码执行此操作:

response.isSuccessful()

在您的processResponse中完成您的工作。但是你要考虑的一件事是RxJava/RxAndroid大部分时间都返回 true ,并不代表你的responseBody包含数据。根据文件:

  

isSuccessful()如果code()在[200..300]范围内,则返回true。

因此,更好的方法是检查您的回复列表是否包含数据。

但是作为一种更好的方法(如果你是初学者则有点困难)正在使用flatMap。您可以使用ShowDialog()一个接一个地处理您的通话。

答案 2 :(得分:0)

什么是异步任务?不仅对于改造而且答案对所有人来说都是一样的,当你使用异步任务编写一些代码时,似乎你允许那些代码异步运行,也就是说,它想要在任何时候运行,而且在后台运行也不会打扰任何其他代码任务,而不是对主UI线程产生任何影响。因此异步任务明确地将自己定义为在后台运行的任务,并且上面或下面编写的代码永远不会受其影响。因此,在您的情况下,异步任务可能尚未完成,或者可能是它可能尚未启动但它不会干扰您的if条件。 https://developer.android.com/reference/android/os/AsyncTask.html