Проблемы в занижении потока выполнения в андроид студии - PullRequest
0 голосов
/ 12 декабря 2018

Следующий код использует retrofit и youtubedata api для получения количества подписчиков двух каналов youtube.

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?

Log

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 не выполнялись до оператора log в последней строке.


Что мне нужно сделать, чтобы достичь желаемого результата?

1 Ответ

0 голосов
/ 12 декабря 2018

Вызовы методов apiService.getSubs (qMap) и apiService.getSubs (qMap2) выполняются в фоновом потоке.Вот почему следующий оператор выполняется до завершения ответа.Отсюда утверждение Log.d ("GEEK", SUBS_PDP + "AFTER");выполняется до метода onResponse ()

Вы можете выполнить второй вызов в onResponse () первого вызова и в onResponse () второго вызова сделать то, что вы хотите сделать дальше или, если возможно, использовать Rxjava.Но первый способ прост для понимания

...