Модернизация библиотеки с API БД фильмов

Я хочу создать приложение для фильмов, которое использует REST api с помощью модификации и отображает изображения с помощью Picasso, а также внедряет Retrofit и показывает настоящие постеры с фильмами, а также подробную информацию для каждого фильма.

Я использую Api базы данных фильмов, чтобы получить реальные данные в нашем приложении. Ознакомьтесь с их документацией и познакомьтесь с их API, особенно с фильмами / популярными конечными точками.

Но при запуске приложения белый экран, показывающий картинки, не показывает фильмы, и я не знаю, в чем проблема

это MainActivity:

package com.walkatheri.movies;

import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import com.squareup.picasso.Picasso;

import java.util.ArrayList;
import java.util.List;

import retrofit.Callback;
import retrofit.RequestInterceptor;
import retrofit.RestAdapter;
import retrofit.RetrofitError;
import retrofit.client.Response;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        RecyclerView mRecyclerView;
        final MoviesAdapter mAdapter;


        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        mRecyclerView.setLayoutManager(new GridLayoutManager(this, 3));
        mAdapter = new MoviesAdapter(this);
        mRecyclerView.setAdapter(mAdapter);


        RestAdapter restAdapter = new RestAdapter.Builder()
                .setEndpoint("http://api.themoviedb.org/3")
                .setRequestInterceptor(new RequestInterceptor() {
                    @Override
                    public void intercept(RequestFacade request) {
                        request.addEncodedQueryParam("api_key", "MY _KEY");
                    }
                })
                .setLogLevel(RestAdapter.LogLevel.FULL)
                .build();
        MoviesApiService service = restAdapter.create(MoviesApiService.class);

        service.getPopularMovies(new Callback<Movies.MovieResult>() {
            @Override
            public void success(Movies.MovieResult movieResult, Response response) {
                mAdapter.setMovieList(movieResult.getResults());
            }

            @Override
            public void failure(RetrofitError error) {
                error.printStackTrace();
            }
        });

    }
    public static class MovieViewHolder extends RecyclerView.ViewHolder {

        public ImageView imageView;
        public MovieViewHolder(View itemView) {
            super(itemView);
            imageView = (ImageView) itemView.findViewById(R.id.imageView);

        }
    }

    public static class MoviesAdapter extends RecyclerView.Adapter<MovieViewHolder> {

        List<Movies>MovieList ;
        private LayoutInflater mInflater;
        private Context mContext;
        public MoviesAdapter(Context context)
        {
            this.mContext = context;
            this.mInflater = LayoutInflater.from(context);
            this.MovieList = new ArrayList<>();
        }
        public void setMovieList(List<Movies> movieList)
        {
            this.MovieList=movieList ;
            // The adapter needs to know that the data has changed. If we don't call this, app will crash.
            notifyDataSetChanged();
        }
        @Override
        public MovieViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = mInflater.inflate(R.layout.row_movie, parent, false);
            MovieViewHolder viewHolder = new MovieViewHolder(view);
            return viewHolder;

        }

        @Override
        public void onBindViewHolder(MovieViewHolder holder, int position) {
            Movies movies = MovieList.get(position);
            Picasso.with(mContext)
                    .load(movies.getPoster()).placeholder(R.color.colorAccent)
                    .into(holder.imageView);

        }

        @Override
        public int getItemCount() {

            return (MovieList == null) ? 0 : MovieList.size();
        }
    }
}

Movies класс:

package com.walkatheri.movies;

import android.graphics.Movie;

import com.google.gson.annotations.SerializedName;

import java.util.List;

/**
 * Created by waad on 08/10/2016.
 */

public class Movies {
    private String title;




    @SerializedName("poster_path")
    private String poster;

    @SerializedName("overview")
    private String description;

    @SerializedName("backdrop_path")
    private String backdrop;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {

        this.title = title;
    }
    public String getPoster() {
        return "http://image.tmdb.org/t/p/w500" + poster;
    }
  //  public String getPoster() {
       // return "http://t2.gstatic.com/images?q=tbn:ANd9GcQW3LbpT94mtUG1PZIIzJNxmFX399wr_NcvoppJ82k7z99Hx6in";
   // }
    public void setPoster(String poster) {

        this.poster = poster;
    }

    public String getDescription() {

        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getBackdrop() {

        return backdrop;
    }

    public void setBackdrop(String backdrop) {

        this.backdrop = backdrop;
    }

    public static class MovieResult {

        private List<Movies> resulte;

        public List<Movies> getResults() {
            return resulte;

        }
    }}

MoviesApiService класс:

package com.walkatheri.movies;

import retrofit.Callback;
import retrofit.http.GET;


/**
 * Created by waad on 18/10/2016.
 */

public interface MoviesApiService {
    @GET("/movie/popular")
    void getPopularMovies(Callback<Movies.MovieResult>cb);

}

person wad    schedule 18.10.2016    source источник
comment
Вы пробовали отлаживать или даже регистрировать некоторую информацию, чтобы убедиться, что вы получаете данные с сервера?   -  person Raghunandan    schedule 19.10.2016
comment
@Raghunandan Я не знаю, причина проблемы решена .. Я пробовал, но не знал, решена   -  person wad    schedule 19.10.2016
comment
тогда похоже, что вы хотите, чтобы кто-то помог вам, не зная о проблеме. Мы попробовали ваш код, чтобы разобраться в проблеме. Можете ли вы отладить и проверить, чтобы сузить проблему   -  person Raghunandan    schedule 19.10.2016
comment
Ваше приложение вылетает или возникают какие-либо ошибки. и можете ли вы опубликовать сервер формы ответа   -  person Raghunandan    schedule 19.10.2016


Ответы (2)


Очень сложно указать на ошибки без каких-либо намеков, таких как трассировки стека.

Некоторые указатели

  1. Используйте асинхронный вызов дооснащения.

  2. Вам нужен .addConverterFactory (GsonConverterFactory.create ()) для преобразования json в pojos.

  3. Изображение будет загружено, только если вы используете URL-адрес http://image.tmdb.org/t/p/w185 "+" yourposterpath ". Проверьте ссылку moviedb

  4. Обновите свои библиотеки и соответствующим образом измените свой api (рекомендуется)

  5. Наконец, чистая архитектура поможет вам правильно писать тесты. Ваш код неструктурирован, и вам необходимо правильно разделить компоненты. Предлагаем вам прочитать о шаблонах MVP или MVVM. Кинжал тоже может помочь.

Хорошее прочтение о модернизации https://inthecheesefactory.com/blog/retrofit-2.0/en

Итак, изменения

public class TestActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;
    private MoviesAdapter mAdapter;

    public static final String MOVIE_DB_API_URL = "http://api.themoviedb.org/3/";
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        mRecyclerView.setLayoutManager(new GridLayoutManager(this, 3));
        mAdapter = new MoviesAdapter(this);
        mRecyclerView.setAdapter(mAdapter);


        final OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(new LoggingInterceptor())
                .connectTimeout(15, TimeUnit.SECONDS)
                .readTimeout(15,TimeUnit.SECONDS)
                .build();
        Retrofit restAdapter = new Retrofit.Builder()
                .baseUrl(MOVIE_DB_API_URL)
                 .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        MoviesApiService service = restAdapter.create(MoviesApiService.class);


        Call<MoviesList> movieResultCallback = service.getPopularMovies();
        // asynchronous call
        movieResultCallback.enqueue(new Callback<MoviesList>() {
            @Override
            public void onResponse(Call<MoviesList> call, Response<MoviesList> response) {

                //int code = response.code();
                // can check the status code 
                mAdapter.setMovieList(response.body().getResults());
            }

            @Override
            public void onFailure(Call<MoviesList> call, Throwable t) {

            }
        });

    }
    public static class MovieViewHolder extends RecyclerView.ViewHolder {

        public ImageView imageView;
        public MovieViewHolder(View itemView) {
            super(itemView);
            imageView = (ImageView) itemView.findViewById(R.id.image);

        }
    }

    public static class MoviesAdapter extends RecyclerView.Adapter<MovieViewHolder> {

        List<Movies>MovieList ;
        private LayoutInflater mInflater;
        private Context mContext;
        public MoviesAdapter(Context context)
        {
            this.mContext = context;
            this.mInflater = LayoutInflater.from(context);
            this.MovieList = new ArrayList<>();
        }
        public void setMovieList(List<Movies> movieList)
        {
            this.MovieList=movieList ;
            // The adapter needs to know that the data has changed. If we don't call this, app will crash.
            notifyDataSetChanged();
        }
        @Override
        public MovieViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = mInflater.inflate(R.layout.row, parent, false);
            MovieViewHolder viewHolder = new MovieViewHolder(view);
            return viewHolder;

        }

        @Override
        public void onBindViewHolder(MovieViewHolder holder, int position) {
            Movies movies = MovieList.get(position);
            Picasso.with(mContext)
                    .load("http://image.tmdb.org/t/p/w185"+movies.getPoster_path()).placeholder(R.color.colorAccent)
                    .into(holder.imageView);

        }

        @Override
        public int getItemCount() {

            return (MovieList == null) ? 0 : MovieList.size();
        }
    }

    public static class LoggingInterceptor implements Interceptor {
        @Override public okhttp3.Response intercept(Chain chain) throws IOException {

            HttpUrl url = chain.request().url()
                    .newBuilder()
                    .addQueryParameter("api_key", "4848b32592990671646565fa3240a7bc")
                    .build();

            Request request = chain.request().newBuilder().url(url).build();;

            long t1 = System.nanoTime();
            String requestLog = String.format("Sending request %s on %s%n%s",
                    request.url(), chain.connection(), request.headers());
            //YLog.d(String.format("Sending request %s on %s%n%s",
            //        request.url(), chain.connection(), request.headers()));
            if(request.method().compareToIgnoreCase("post")==0){
                requestLog ="\n"+requestLog+"\n"+bodyToString(request);
            }
            Log.d("TAG","request"+"\n"+requestLog);

            okhttp3.Response response = chain.proceed(request);
            long t2 = System.nanoTime();

            String responseLog = String.format("Received response for %s in %.1fms%n%s",
                    response.request().url(), (t2 - t1) / 1e6d, response.headers());

            String bodyString = response.body().string();

            Log.d("TAG","response"+"\n"+responseLog+"\n"+bodyString);

            return response.newBuilder()
                    .body(ResponseBody.create(response.body().contentType(), bodyString))
                    .build();
            //return response;
        }
    }

    private static String bodyToString(final Request request) {

        try {
            final Request copy = request.newBuilder().build();
            final Buffer buffer = new Buffer();
            if (copy != null && copy.body() != null) // make sure its not null to avoif NPE
                copy.body().writeTo(buffer);
            return buffer.readUtf8();
        } catch (final IOException e) {
            return "did not work";
        }
    }
}

потом

public interface MoviesApiService {
    @GET("movie/popular")
    Call<MoviesList> getPopularMovies();

}

Мои классы моделей

Используйте http://www.jsonschema2pojo.org/ для преобразования json в pojo

Я скопировал нижеприведенное для одного из репозиториев на github.

На гитхабе доступно множество подобных репозиториев. https://github.com/ewintory/udacity-popular-movies и многое другое. . public class Movies реализует Parcelable {

    private int id,vote_count,favourite,reviewsaved,trailersaved;
    private float vote_average,popularity;

    private String original_language,original_title,overview,release_date,poster_path,title,generids,backdrop_path;
    private boolean video,favored;

    public Movies()
    {

    }

    public void setReviewsaved(int reviewsaved) {
        this.reviewsaved = reviewsaved;
    }

    public void setTrailersaved(int trailersaved) {
        this.trailersaved = trailersaved;
    }

    public int getTrailersaved() {
        return trailersaved;
    }

    public int getReviewsaved() {
        return reviewsaved;
    }

    public void setFavored(boolean favored) {
        this.favored = favored;
    }



    public void setId(int id) {
        this.id = id;
    }

    public void setVote_count(int vote_count) {
        this.vote_count = vote_count;
    }

    public void setFavourite(int favourite) {
        this.favourite = favourite;
    }

    public void setVote_average(float vote_average) {
        this.vote_average = vote_average;
    }

    public void setOriginal_language(String original_language) {
        this.original_language = original_language;
    }


    public void setOriginal_title(String original_title) {
        this.original_title = original_title;
    }

    public void setOverview(String overview) {
        this.overview = overview;
    }

    public void setRelease_date(String release_date) {
        this.release_date = release_date;
    }

    public void setPoster_path(String poster_path) {
        this.poster_path = poster_path;
    }

    public void setPopularity(float popularity) {
        this.popularity = popularity;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public void setGenerids(String generids) {
        this.generids = generids;
    }

    public void setbackdrop_path(String backdrop_path) {
        this.backdrop_path = backdrop_path;
    }

    public void setVideo(boolean video) {
        this.video = video;
    }

    public String getGenerids() {
        return generids;
    }

    public int getId() {
        return id;
    }

    public int getVote_count() {
        return vote_count;
    }

    public float getVote_avarage() {
        return vote_average;
    }

    public String getOriginal_language() {
        return original_language;
    }

    public String getOriginal_title() {
        return original_title;
    }

    public String getOverview() {
        return overview;
    }

    public String getRelease_date() {
        return release_date;
    }

    public String getBackdrop_path() {
        return backdrop_path;
    }

    public int getFavourtite() {
        return favourite;
    }

    public String getPoster_path() {
        return poster_path;
    }

    public float getPopularity() {
        return popularity;
    }

    public String getTitle() {
        return title;
    }

    public boolean isVideo() {
        return video;
    }

    // Parcelling part

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(this.original_language);
        dest.writeString(this.original_title);
        dest.writeString(this.overview);
        dest.writeString(this.poster_path);

        dest.writeString(this.generids);
        dest.writeString(this.title);
        dest.writeString(this.release_date);

        dest.writeString(this.backdrop_path);

        dest.writeInt(this.favourite);
        dest.writeInt(this.id);
        dest.writeInt(this.vote_count);
        dest.writeFloat(this.vote_average);
        dest.writeFloat(this.popularity);


    }

    protected Movies(Parcel in) {
        this.original_language = in.readString();
        this.original_title = in.readString();
        this.overview = in.readString();
        this.poster_path = in.readString();
        this.generids = in.readString();
        this.title = in.readString();
        this.release_date = in.readString();
        this.backdrop_path = in.readString();

        this.favourite = in.readInt();
        this.id = in.readInt();
        this.vote_count = in.readInt();
        this.vote_average =in.readFloat();
        this.popularity = in.readFloat();

    }

    public static final Creator<Movies> CREATOR = new Creator<Movies>() {
        public Movies createFromParcel(Parcel source) {
            return new Movies(source);
        }

        public Movies[] newArray(int size) {
            return new Movies[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }
}

ФильмыСписок

public class MoviesList {

    private int total_pages;

    public int getTotal_pages() {
        return total_pages;
    }

    private ArrayList<Movies> results;

    public ArrayList<Movies> getResults() {
        return results;
    }
}

Наконец-то обновили библиотеки

// Okhttp
compile 'com.squareup.okhttp3:okhttp:3.4.1'

//Retrofit and adapters
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.picasso:picasso:2.5.2'

Вы можете проверить свои журналы

person Raghunandan    schedule 18.10.2016

Практически невозможно точно знать, что происходит, учитывая ваш неопределенный ввод, но я готов поспорить, что вы не указали разрешение в Интернете в манифесте приложения:

<uses-permission android:name="android.permission.INTERNET"/>

(в src / main / AndroidManifest.xml, под тегом manifest)

person Przemyslaw Jablonski    schedule 21.10.2016