• Как вызвать Callback() с фрагмента для Retrofit?

    @newdancer Автор вопроса
    Denis Zagayevskiy:
    1. Я так понимаю при использовании enqueue Thread не нужен
    3. я так понимаю это и есть поток
    переделал код без thread
    public void getCinemaFrag()
        {
            // Создаем адаптер с базовым адресом
            Retrofit.Builder builder = new Retrofit.Builder();
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(SOURCE_MOON)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
            Retrofit retrofit2 = new Retrofit.Builder()
                    .baseUrl(SOURCE_KP)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
    
            // Создаём сервисы API
            apiMoon = retrofit.create(APIMoon.class);
            apiKp= retrofit2.create(APIKp.class);
            
            mProgressBar.setVisibility(View.VISIBLE);
            // Получаем данные
            cinemas.clear();
            Call<KinoModel> call = apiMoon.getCinema(API_TOKEN);
            call.enqueue(new Callback<KinoModel>() {
                @Override
                public void onResponse(Call<KinoModel> call, Response<KinoModel> response) {
                    if (!call.isExecuted()) {
                        try {
                            kinoModel = call.execute().body();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        for (int k = 0; k < kinoModel.getNumUpdates(); k++) {
                            film_ID = kinoModel.getUpdates().get(k).getKP();
                            if (film_ID != 0) {
                                Call<KinoModelKp> call2 = apiKp.getKp(film_ID);
                                try {
                                    if (!call2.isExecuted()) {
                                        kinoModelKp = call2.execute().body();
                                    }
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
                                if (film_ID != 0) {
                                    cinemas.add(new Cinema(kinoModel.getUpdates().get(k).getTitleRU(), kinoModel.getUpdates().get(k).getTitleEN(),
                                            kinoModel.getUpdates().get(k).getKP(), kinoModel.getUpdates().get(k).getToken(), kinoModel.getUpdates().get(k).getType(),
                                            kinoModel.getUpdates().get(k).getCAM(), kinoModel.getUpdates().get(k).getIframe(), kinoModel.getUpdates().get(k).getTranslate(),
                                            kinoModel.getUpdates().get(k).getTranslateID(), kinoModel.getUpdates().get(k).getAdded(), "http://st.kp.yandex.net/images/" + kinoModelKp.getPoster(), kinoModelKp.getKPYear(), kinoModelKp.getDescription()));
                                    //http://st.kp.yandex.net/images/film_big/"+film_ID+".jpg
                                } else {
                                    cinemas.add(new Cinema(kinoModel.getUpdates().get(k).getTitleRU(), kinoModel.getUpdates().get(k).getTitleEN(),
                                            kinoModel.getUpdates().get(k).getKP(), kinoModel.getUpdates().get(k).getToken(), kinoModel.getUpdates().get(k).getType(),
                                            kinoModel.getUpdates().get(k).getCAM(), kinoModel.getUpdates().get(k).getIframe(), kinoModel.getUpdates().get(k).getTranslate(),
                                            kinoModel.getUpdates().get(k).getTranslateID(), kinoModel.getUpdates().get(k).getAdded(), "", 0, "описание отсутствует..."));
                                }
                                call2.enqueue(new Callback<KinoModelKp>() {
                                    @Override
                                    public void onResponse(Call<KinoModelKp> call2, Response<KinoModelKp> response2) {
                                            Log.d("myLogs", "OK!");
                                            mProgressBar.setVisibility(View.GONE);
                                            cinemaAdapter = new CinemaAdapter(getActivity(), cinemas);
                                            cinemaAdapter.notifyDataSetChanged();
                                            // настраиваем список
                                            lvMain.setAdapter(cinemaAdapter);
    
                                    }
    
                                    @Override
                                    public void onFailure(Call<KinoModelKp> call, Throwable t) {
                                        Log.d("myLogs", "NOT OK!");
                                    }
                                });
                            }
                        }
                    }
                }
    
                @Override
                public void onFailure(Call<KinoModel> call, Throwable t) {
                    Log.d("myLogs", "NOT OK!");
                }
            });
        }

    теперь данные вообще не грузятся
  • Как вызвать Callback() с фрагмента для Retrofit?

    @newdancer Автор вопроса
    Denis Zagayevskiy: нашел как но где то ошибка:
    public void getCinemaFrag()
        {
            // Создаем адаптер с базовым адресом
            Retrofit.Builder builder = new Retrofit.Builder();
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(SOURCE_MOON)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
            Retrofit retrofit2 = new Retrofit.Builder()
                    .baseUrl(SOURCE_KP)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
    
            // Создаём сервисы API
            apiMoon = retrofit.create(APIMoon.class);
            apiKp= retrofit2.create(APIKp.class);
    
            Thread t = new Thread(new Runnable(){
                @Override
                public void run(){
                    mProgressBar.setVisibility(View.VISIBLE);
                    // Получаем данные
                    cinemas.clear();
                    Call<KinoModel> call = apiMoon.getCinema(API_TOKEN);
                    call.enqueue(new Callback<KinoModel>() {
                        @Override
                        public void onResponse(Call<KinoModel> call, Response<KinoModel> response) {
                            try {
                                    kinoModel = call.execute().body();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                            if(response.isSuccess())
                            {
                                for (int k = 0; k < kinoModel.getNumUpdates(); k++) {
                                    film_ID = kinoModel.getUpdates().get(k).getKP();
                                    if (film_ID != 0) {
                                        Call<KinoModelKp> call2 = apiKp.getKp(film_ID);
                                        try {
                                            kinoModelKp = call2.execute().body();
                                        } catch (IOException e) {
                                            e.printStackTrace();
                                        }
                                        if (film_ID != 0) {
                                            cinemas.add(new Cinema(kinoModel.getUpdates().get(k).getTitleRU(), kinoModel.getUpdates().get(k).getTitleEN(),
                                                    kinoModel.getUpdates().get(k).getKP(), kinoModel.getUpdates().get(k).getToken(), kinoModel.getUpdates().get(k).getType(),
                                                    kinoModel.getUpdates().get(k).getCAM(), kinoModel.getUpdates().get(k).getIframe(), kinoModel.getUpdates().get(k).getTranslate(),
                                                    kinoModel.getUpdates().get(k).getTranslateID(), kinoModel.getUpdates().get(k).getAdded(), "http://st.kp.yandex.net/images/" + kinoModelKp.getPoster(), kinoModelKp.getKPYear(), kinoModelKp.getDescription()));
                                            //http://st.kp.yandex.net/images/film_big/"+film_ID+".jpg
                                        } else {
                                            cinemas.add(new Cinema(kinoModel.getUpdates().get(k).getTitleRU(), kinoModel.getUpdates().get(k).getTitleEN(),
                                                    kinoModel.getUpdates().get(k).getKP(), kinoModel.getUpdates().get(k).getToken(), kinoModel.getUpdates().get(k).getType(),
                                                    kinoModel.getUpdates().get(k).getCAM(), kinoModel.getUpdates().get(k).getIframe(), kinoModel.getUpdates().get(k).getTranslate(),
                                                    kinoModel.getUpdates().get(k).getTranslateID(), kinoModel.getUpdates().get(k).getAdded(), "", 0, "описание отсутствует..."));
                                        }
                                        call2.enqueue(new Callback<KinoModelKp>() {
                                            @Override
                                            public void onResponse(Call<KinoModelKp> call2, Response<KinoModelKp> response) {
                                                if (response.isSuccess()) {
                                                    Log.d("myLogs", "OK!");
                                                    mProgressBar.setVisibility(View.GONE);
                                                    cinemaAdapter = new CinemaAdapter(getActivity(), cinemas);
                                                    cinemaAdapter.notifyDataSetChanged();
                                                    // настраиваем список
                                                    lvMain.setAdapter(cinemaAdapter);
                                                }
                                            }
    
                                            @Override
                                            public void onFailure(Call<KinoModelKp> call, Throwable t) {
                                                Log.d("myLogs", "NOT OK!");
                                            }
                                        });
                                    }
                                }
                            }
                        }
    
                        @Override
                        public void onFailure(Call<KinoModel> call, Throwable t) {
                            Log.d("myLogs", "NOT OK!");
                        }
                    });
                }
            });
            t.start();
        }
    }

    в это строке kinoModel = call.execute().body();
    выдает ошибку java.lang.IllegalStateException: Already executed.
    В чем ошибся?
  • Как вызвать Callback() с фрагмента для Retrofit?

    @newdancer Автор вопроса
    Denis Zagayevskiy: переделал. как в Retrofit2 узнать когда данные со второго апи получены?
  • Как вызвать Callback() с фрагмента для Retrofit?

    @newdancer Автор вопроса
    Denis Zagayevskiy: с адаптером так и делаю. Я так понял что сам класс api должен выглядеть так. возвращать response
    public interface APIKp
    {
        @GET("/getFilm")
        Response getKp(@Query("filmID") int film_ID);
    }

    Только как сюда прилепить CallBack?
  • Как вызвать Callback() с фрагмента для Retrofit?

    @newdancer Автор вопроса
    Denis Zagayevskiy: попробовал сделать через синхронный вызов
    public void getCinemaFrag()
        {
            // Создаем адаптер с базовым адресом
            RestAdapter restAdapter = new RestAdapter.Builder().setEndpoint(SOURCE_MOON).build();
            RestAdapter restAdapter2 = new RestAdapter.Builder().setEndpoint(SOURCE_KP).build();
            // Создаём сервисы API
            apiMoon = restAdapter.create(APIMoon.class);
            apiKp= restAdapter2.create(APIKp.class);
    
            Thread t = new Thread(new Runnable(){
                @Override
                public void run(){
                    mProgressBar.setVisibility(View.VISIBLE);
                    KinoModel kinoModel = apiMoon.getCinema(API_TOKEN);
                    // Получаем ввиде json и конвертируем
                    cinemas.clear();
                    for (int k = 0; k < kinoModel.getNumUpdates(); k++) {
                        film_ID = kinoModel.getUpdates().get(k).getKP();
    
                        if (film_ID != 0) {
                            KinoModelKp kinoModelKp = apiKp.getKp(film_ID);
                            cinemas.add(new Cinema(kinoModel.getUpdates().get(k).getTitleRU(), kinoModel.getUpdates().get(k).getTitleEN(),
                                    kinoModel.getUpdates().get(k).getKP(), kinoModel.getUpdates().get(k).getToken(), kinoModel.getUpdates().get(k).getType(),
                                    kinoModel.getUpdates().get(k).getCAM(), kinoModel.getUpdates().get(k).getIframe(), kinoModel.getUpdates().get(k).getTranslate(),
                                    kinoModel.getUpdates().get(k).getTranslateID(), kinoModel.getUpdates().get(k).getAdded(), "http://st.kp.yandex.net/images/film_big/"+String.valueOf(film_ID)+".jpg", kinoModelKp.getKPYear()));
                            //http://st.kp.yandex.net/images/film_big/"+film_ID+".jpg
                        } else {
                            cinemas.add(new Cinema(kinoModel.getUpdates().get(k).getTitleRU(), kinoModel.getUpdates().get(k).getTitleEN(),
                                    kinoModel.getUpdates().get(k).getKP(), kinoModel.getUpdates().get(k).getToken(), kinoModel.getUpdates().get(k).getType(),
                                    kinoModel.getUpdates().get(k).getCAM(), kinoModel.getUpdates().get(k).getIframe(), kinoModel.getUpdates().get(k).getTranslate(),
                                    kinoModel.getUpdates().get(k).getTranslateID(), kinoModel.getUpdates().get(k).getAdded(), "", 0));
                        }
                    }
    
                }
            });
            t.start();
    
            try {
                t.join();
                mProgressBar.setVisibility(View.GONE);
                cinemaAdapter = new CinemaAdapter(getActivity(), cinemas);
                cinemaAdapter.notifyDataSetChanged();
                // настраиваем список
                lvMain.setAdapter(cinemaAdapter);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    метод getCinemaFrag() вызываю из onCreateView при этом пока грузятся данные висит интерфес. то не так сделал?
  • Как вызвать Callback() с фрагмента для Retrofit?

    @newdancer Автор вопроса
    Denis Zagayevskiy: а если перевести на синхронный? и второй тогда делать синхронным?
  • Как вызвать Callback() с фрагмента для Retrofit?

    @newdancer Автор вопроса
    Denis Zagayevskiy: спасибо! Все получилось. Только как использовать его в методах?
    к примеру у меня метод
    public String getKP (int film_ID)
        {
            apiKp.getKp(film_ID, new Callback<KinoModelKp>() {
                @Override
                public void success(KinoModelKp kinoModelKp, Response response) {
                    rat = "KP=" + String.valueOf(kinoModelKp.ratingData.rating) + "(" + kinoModelKp.ratingData.ratingVoteCount + "); IMDB=" + String.valueOf(kinoModelKp.ratingData.ratingIMDb) + "(" + kinoModelKp.ratingData.ratingIMDbVoteCount + ")";
                    Log.d("myLogs", "rat1=" + rat);
                }
    
                @Override
                public void failure(RetrofitError error) {
                    Log.d("myLogs", "KP! Failed!!! = " + error.getResponse());
                }
            });
    
            Log.d("myLogs", "rat2=" + rat);
            return rat;
        }

    изначально переменная String rat="";
    Так вот при выполнении такого метода из переменная rat="". Как задержать выполнение return пока не отработает retrofit?
  • Как вызвать Callback() с фрагмента для Retrofit?

    @newdancer Автор вопроса
    Denis Zagayevskiy: эти данные я так понимаю нужно получать через массив, а не через List?
    Вот блин. И из-за этого я и year получить не могу.
  • Как вызвать Callback() с фрагмента для Retrofit?

    @newdancer Автор вопроса
    Denis Zagayevskiy: error.getResponse().getReason() выдает OK
    error.getResponse().getUrl() выдал http://api.kinopoisk.cf/getFilm?filmID=840623 т.е. сформировалось все нормально.
    Вариантов там еще много. какой посмотреть?
  • Как вызвать Callback() с фрагмента для Retrofit?

    @newdancer Автор вопроса
    Denis Zagayevskiy: при таком способе
    error.getResponse().toString()
    получил retrofit.client.Response@27668984
    или не так надо смотреть?
  • Как вызвать Callback() с фрагмента для Retrofit?

    @newdancer Автор вопроса
    Denis Zagayevskiy: Попытался добавить еще возможность парсить с другого файла json c другой структурой и все завершается методом failure.
    RestAdapter restAdapter2 = new RestAdapter.Builder().setEndpoint(SOURCE_KP).build();
    APIKp apiKp= restAdapter2.create(APIKp.class);
    
            apiKp.getKp(film_ID, new Callback<KinoModelKp>() {
                @Override
                public void success(KinoModelKp kinoModelKp, Response response) {
    
                    Log.d("myLogs", "s=" + String.valueOf(kinoModelKp.getKPYear()));
                }
    
                @Override
                public void failure(RetrofitError error) { Log.d("myLogs", "KP! Failed!!!"); }
            });


    Сама структура KinoModelKp выглядит так:
    public class KinoModelKp
    {
        @Expose
        private List<KpRatUpd> ratingData;
    
        @Expose
        private int year;
    
        public List<KpRatUpd> getRatUpdates() {return ratingData;}
    
        public int getKPYear() {
            return year;
        }
    
        public class KpRatUpd {
            @SerializedName("rating")
            private float rating;
            @SerializedName("ratingVoteCount")
            private int ratingVoteCount;
            @SerializedName("ratingIMDb")
            private float ratingIMDb;
            @SerializedName("ratingIMDbVoteCount")
            private int ratingIMDbVoteCount;
    
            public float getRatKP() {
                return rating;
            }
    
            public int getRatKPVote() {
                return ratingVoteCount;
            }
    
            public float getRatImdb() {
                return ratingIMDb;
            }
    
            public int getRatImdbVote() {
                return ratingIMDbVoteCount;
            }
        }
    }

    вот результат json
    http://api.kinopoisk.cf/getFilm?filmID=840623
    то не так сделал?
  • Как вызвать Callback() с фрагмента для Retrofit?

    @newdancer Автор вопроса
    Вопрос встречный зачем? В чем преимущество 2 версии от первой?
  • Как вызвать Callback() с фрагмента для Retrofit?

    @newdancer Автор вопроса
    Denis Zagayevskiy: спасибо! все получилось!
  • Как вызвать Callback() с фрагмента для Retrofit?

    @newdancer Автор вопроса
    Denis Zagayevskiy: а пока просто пытался вывести в лог
    api.getCinema(API_TOKEN, new Callback() {
    @Override
    public void success(KinoModel kinoModel, Response response) {
    // Получаем ввиде json и конвертируем
    Log.d("myLogs", "s="+kinoModel.getUpdates().get(0));
    }
    @Override
    public void failure(RetrofitError error) {
    Log.d("myLogs", "Failed!!!");
    }
    });
    результат получился такой s=net.kinomovies.onlinemovielibrary.KinoModel$Upd@85d2ea1
  • Как вызвать Callback() с фрагмента для Retrofit?

    @newdancer Автор вопроса
    Denis Zagayevskiy: в каком формате получает retrofit результат когда массив updates???
    попробовал сделать так
    @Expose
    private List updates;
    public List getUpdates()
    {
    return updates;
    }
    public class Upd {
    @SerializedName("title_ru")
    private String title_ru;
    }
    результат получается в виде кода типа: название пакета$Upd@85d2ea1
  • Как вызвать Callback() с фрагмента для Retrofit?

    @newdancer Автор вопроса
    А еще подскажите при вот таком виде json
    {"current_page":1,"updates":[{"title_ru":"Американский герой","title_en":"American Hero","kinopoisk_id":915528,"token":"830c4e15d04edcd2","type":"movie","camrip":false,"iframe_url":"moonwalk.cc/video/830c4e15d04edcd2/iframe","translator":"datynet","translator_id":73,"added_at":"2016-02-24 18:01:01","category":null},

    Если мне нужно значение поля title_ru, то необходимо сначала через модель получить массив updates? так?
  • Ошибка в приложении must implement onSomeEventListener? Что не так?

    @newdancer Автор вопроса
    Если класс API должен возвращать данные только в фрагмент, то в MainActivity его запускающего тоже должен прописываться интерфейс?
  • Вызов статического метода MainActivity из другого класса?

    @newdancer Автор вопроса
    VZVZ: написал ниже в ответ полный код MainActivity и API класса
  • Вызов статического метода MainActivity из другого класса?

    @newdancer Автор вопроса
    Sirikid: UpdateAdapter() прописан еще в onCreate для того чтобы создавать его при запуске приложения. А необходимо так:
    1. Пользователь нажимает кнопку
    2. Данные через класс API отправляются, там же добавляются в бд Content provider
    3. А уже потом вызывается UpdateAdapter()
  • Вызов статического метода MainActivity из другого класса?

    @newdancer Автор вопроса
    Sirikid: кусок кода выглядит так

    butSearch.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    api.translate(editVvodText.getText().toString(), API.RUSSIAN, API.ENGLISH);
    }

    // очищаем edittext
    editVvodText.setText("");

    // метод обновления адаптера
    updateAdapter();
    }
    });

    И суть в том что этот класс из-за api обрабатывается долго. И updateAdapter() обрабатывается раньше него