正如您在下面的代码中看到的,我调用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服务,我怎么能这样做,因为入队 改造工作异步,不要等待第一种方法,因为 它在另一个线程中开始第二个方法 因为我的数据还没有从第一种方法获得,我的程序是 坠毁了,我没有得到答案。那是我的问题.....
干杯
答案 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