Второй запрос okHTTP ждёт, пока первый завершится sh Android - PullRequest
0 голосов
/ 21 марта 2020

Я пытаюсь вызвать и IMDb API 2 раза, при первом вызове и получении идентификатора для этого фильма / шоу и во второй раз, когда он использует этот идентификатор для получения всей информации об этом фильме / шоу, мне также нужно этот идентификатор для другой части приложения, поэтому я делаю это таким образом. Проблема заключается в том, что второй вызов не ожидает выполнения первого вызова. Я думаю, именно поэтому переменные не обновляются, когда я пытаюсь их использовать. Это мой метод onCreate, где все это происходит, я взял некоторые ключи API по понятным причинам:

@Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.imdb_activity);

        mTextViewResult = findViewById(R.id.text_view_result);

        OkHttpClient client1 = new OkHttpClient();
        //change the url to be generic and usable for user input
        String urlforID = "https://movie-database-imdb-alternative.p.rapidapi.com/?page=1&r=json&s=Avengers";
        final Request request = new Request.Builder()
                .url(urlforID)
                .get()
                .addHeader("x-rapidapi-host", "movie-database-imdb-alternative.p.rapidapi.com")
                .addHeader("x-rapidapi-key", "KEYGOESHERE")
                .build();
        client1.newCall(request).enqueue(new Callback()
        {
            @Override
            public void onFailure(Call call, IOException e)
            {
                e.printStackTrace();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException
            {
                if(response.isSuccessful())
                {
                    String myResponse = response.body().string();
                    try
                    {
                        myObj = new JSONObject(myResponse);
                    }
                    catch (JSONException e)
                    {
                        e.printStackTrace();
                    }

                    try
                    {
                        myArray = myObj.getJSONArray("Search");

//                responseID = new String[myArray.length()];//might have to subtract 1

                        for(int i = 0; i < myArray.length(); i++)
                        {
                            JSONObject obj1 = myArray.getJSONObject(i);
                            responseID[i] = obj1.getString("imdbID");
//                            Log.d("id","the id that was just put in was: " + responseID[i]);
                        }
                    }
                    catch(JSONException e)
                    {
                        e.printStackTrace();
                    }

                    imdb_activity.this.runOnUiThread(new Runnable()
                    {
                        @Override
                        public void run()
                        {
                            //new ReadJsonForID().execute();
                            Log.d("id", "The id is: " + responseID[0]);
                            mTextViewResult.setText(responseID[0]);
                        }
                    });
                }
            }
        });
//this is where call 2 would happen but it is not saving the variable how it should
            Log.d("id", "The id is after finish: " + mTextViewResult.getText());

1 Ответ

1 голос
/ 23 марта 2020

Вы можете использовать CountDownLatch -класс в пакете java.util.concurrent. В первом вызове создается экземпляр countDownLatch, а во втором вызове вы ожидаете CountDownLatch. Это может потребовать поставить второе задание в AsyncTask.

...