以下代码使用改造和 youtubedata api 来获取两个 youtube channel 的订阅者数量。
public class NavigationActivity extends AppCompatActivity {
private static String GOOGLE_YOUTUBE_API_KEY = "AIzaSyBV4XQEZ9l1HZeBQFL6ZZvHYfMhtnqUkmw";
private static String CHANNEL_ID_TS = "UCq-Fj5jknLsUf-MWSy4_brA";
private static String CHANNEL_ID_PDP = "UC-lHJZR3Gqxm24_Vd_AJ5Yw";
public static int SUBS_TS = 0;
public static int SUBS_PDP = 0;
//?part=snippet%2CcontentDetails%2Cstatistics&id=UC_x5XG1OV2P6uZZ5FSM9Ttw&key=AIzaSyBV4XQEZ9l1HZeBQFL6ZZvHYfMhtnqUkmw
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_navigation);
Map<String, String> qMap = new HashMap<>();
qMap.put("part", "snippet,contentDetails,statistics");
qMap.put("id", CHANNEL_ID_TS);
qMap.put("key", GOOGLE_YOUTUBE_API_KEY);
Map<String, String> qMap2 = new HashMap<>();
qMap2.put("part", "snippet,contentDetails,statistics");
qMap2.put("id", CHANNEL_ID_PDP);
qMap2.put("key", GOOGLE_YOUTUBE_API_KEY);
ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
Call<ChannelResponse> call = apiService.getSubs(qMap);
call.enqueue(new Callback<ChannelResponse>() {
@Override
public void onResponse(Call<ChannelResponse> call, Response<ChannelResponse> response) {
List<Channel> channels = response.body().getChannels();
SUBS_TS = channels.get(0).getStatistics().getSubscriberCount();
Log.d("GEEK", SUBS_TS + "");
}
@Override
public void onFailure(Call<ChannelResponse> call, Throwable t) {
Log.d("GEEK", t.toString());
}
});
Call<ChannelResponse> call2 = apiService.getSubs(qMap2);
call2.enqueue(new Callback<ChannelResponse>() {
@Override
public void onResponse(Call<ChannelResponse> call, Response<ChannelResponse> response) {
List<Channel> channels = response.body().getChannels();
SUBS_PDP = channels.get(0).getStatistics().getSubscriberCount();
Log.d("GEEK", SUBS_PDP + "");
}
@Override
public void onFailure(Call<ChannelResponse> call, Throwable t) {
Log.d("GEEK", t.toString());
}
});
//This statement seems to be executed before the SUSB_TS and SUSB_PDP variables are updated using the response.
Log.d("GEEK", SUBS_PDP + "AFTER");
}
为什么是
Log.d("GEEK", SUBS_PDP + "AFTER");
在 onResponse 方法之前执行的语句?
日志
2018-12-12 14:30:26.993 17518-17518/com.geek.wartube D/GEEK: 0AFTER
2018-12-12 14:30:27.863 17518-17518/com.geek.wartube D/GEEK: 76222082
2018-12-12 14:30:27.885 17518-17518/com.geek.wartube D/GEEK: 75161493
我还使用调试器检查过 onResponse 中的语句没有在最后一行的日志语句之前执行。
我应该怎么做才能达到预期的结果?
最佳答案
对 apiService.getSubs(qMap) 和 apiService.getSubs(qMap2) 方法的调用在后台线程中完成。这就是为什么在响应完成之前执行下一条语句的原因。因此声明 Log.d("GEEK", SUBS_PDP + "AFTER");在 onResponse() 方法之前执行
您可以在第一次调用的 onResponse() 中执行第二次调用,在第二次调用的 onResponse() 中执行您接下来想做的任何事情,或者如果可能的话使用 Rxjava。但是第一种方式很容易理解
关于android - 低估android studio中执行流程的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53739574/