1
votes

Obtenir des données nulles sur le corps de la réponse à l'aide de retrofit2?

Je suis nouveau dans la mise à niveau 2 et j'essaie d'obtenir des données de tableau json mais en obtenant null, c'est l'URL pour obtenir les données.

Mais le plus drôle, c'est quand j'essaye de déboguer dans onResponse Je reçois un message de réussite ainsi que des données response.body . Quel est le problème ici?

https://xenzet.com/GameCheat/viewgamesjson .php

ceci est des données json

class GameRecyclerViewAdapter extends RecyclerView.Adapter<GameRecyclerViewAdapter.ViewHolder> {

    private List<Games> mGames;
    private LayoutInflater mInflater;
    private ItemClickListener mClickListener;

    // data is passed into the constructor
    GameRecyclerViewAdapter(Context context, List<Games> games) {
        this.mInflater = LayoutInflater.from(context);
        this.mGames = games;
    }

    // inflates the row layout from xml when needed
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = mInflater.inflate(R.layout.gameitem, parent, false);
        return new ViewHolder(view);
    }



    // binds the data to the TextView in each row
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        Games Game = mGames.get(position);
        String Gameid = Game.getGameid();
        String Gameicon = Game.getGameIcon();
        String Gamename = Game.getGamesName();
        holder.GameNameTxt.setText(Gamename);
        Glide.with(holder.GameIconImage.getContext()).load(Game.getGameIcon()).thumbnail(0.1f).
                placeholder(R.color.colorPrimary).diskCacheStrategy(DiskCacheStrategy.NONE).into(holder.GameIconImage);

    }

    // total number of rows
    @Override
    public int getItemCount() {


        return mGames == null ? 0 : mGames.size();

    }


    // stores and recycles views as they are scrolled off screen
    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        TextView GameNameTxt;
        ImageView GameIconImage;
        ViewHolder(View itemView) {
            super(itemView);
            GameNameTxt = itemView.findViewById(R.id.gamename);
            GameIconImage = itemView.findViewById(R.id.imageView);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
        }
    }


    // allows clicks events to be caught
    void setClickListener(ItemClickListener itemClickListener) {
        this.mClickListener = itemClickListener;
    }

    // parent activity will implement this method to respond to click events
    public interface ItemClickListener {
        void onItemClick(View view, int position);

    }
}

c'est la méthode qui essaie d'obtenir des données

public class Games {

    @SerializedName("gameid")
    @Expose
    private String gameid;
    @SerializedName("gameIcon")
    @Expose
    private String gameIcon;
    @SerializedName("Games_Name")
    @Expose
    private String gamesName;

    public String getGameid() {
        return gameid;
    }

    public void setGameid(String gameid) {
        this.gameid = gameid;
    }

    public String getGameIcon() {
        return gameIcon;
    }

    public void setGameIcon(String gameIcon) {
        this.gameIcon = gameIcon;
    }

    public String getGamesName() {
        return gamesName;
    }

    public void setGamesName(String gamesName) {
        this.gamesName = gamesName;
    }

//    public Games(String Gameid,String Gameicon,String GameName)
//    {
//      this.gameid = Gameid;
//      this.gameIcon = Gameicon;
//      this.gamesName = GameName;
//
//    }

}

ceci est ApiClient

2019-05-27 14:03:43.261 1261-1261/com.example.quizgames E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.quizgames, PID: 1261
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setAdapter(android.support.v7.widget.RecyclerView$Adapter)' on a null object reference
    at com.example.quizgames.GamesActivity$1.onResponse(GamesActivity.java:109)
    at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:70)
    at android.os.Handler.handleCallback(Handler.java:836)
    at android.os.Handler.dispatchMessage(Handler.java:103)
    at android.os.Looper.loop(Looper.java:203)
    at android.app.ActivityThread.main(ActivityThread.java:6251)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)

et Api

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_games);
    gameslist = new ArrayList<Games>();
    RecyclerView recyclerView = findViewById(R.id.recyclerview_gameslist);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
     fetch_information();

    Toast.makeText(getApplicationContext(),"" +gamescounter, Toast.LENGTH_SHORT).show();

    adapter = new GameRecyclerViewAdapter(this, gameslist);

   recyclerView.setAdapter(adapter);
    adapter.setClickListener((GameRecyclerViewAdapter.ItemClickListener) this);
}

et dans OnCreate, j'appelle chercher des informations méthode.

public interface Api {

    @GET("viewgamesjson.php")
    Call<List<Games>> GetGames();
}

tente de remplir les données de la liste des jeux dans la vue du recycleur mais échoue car elle est nulle.

c'est logcat

public class ApiClient {

    public static  String Base_URL ;

    public static Retrofit retrofit;

    public static Retrofit getApiClient()
    {
        if (retrofit == null)
        {
            Base_URL ="https://xenzet.com/GameCheat/";
            retrofit = new Retrofit.Builder().baseUrl(Base_URL)
                    .addConverterFactory(GsonConverterFactory.create()).build();

        }
        return retrofit;
    }
}

Ceci est des jeux de classe

 public void fetch_information() {

        ApiInterface = ApiClient.getApiClient().create(Api.class);

        Call<List<Games>> call = ApiInterface.GetGames();


        call.enqueue(new Callback<List<Games>>() {
            @Override
            public void onResponse(Call<List<Games>> call, Response<List<Games>> response) {
                if(response.isSuccessful()) {

                    gameslist = response.body();
                    gamescounter = gameslist.size();
                    adapter = new GameRecyclerViewAdapter(GamesActivity.this, gameslist);
                    recyclerView.setAdapter(adapter);
                }
            }


            @Override
            public void onFailure(Call<List<Games>> call, Throwable t) {
                Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });

    }

Ceci est une vue recycleur

[
    {
        "gameid":"2",
        "gameIcon":"https:\/\/xenzet.com\/GameCheat\/uploads\/counter strike 1.6.png",
        "Games_Name":"1"
    },
    {
        "gameid":"3",
        "gameIcon":"https:\/\/xenzet.com\/GameCheat\/uploads\/gta.ico",
        "Games_Name":"vice city sucjlfsdrgefdsrhag"
    },
    {
        "gameid":"4",
        "gameIcon":"https:\/\/xenzet.com\/GameCheat\/uploads\/pubg.png",
        "Games_Name":"pubg"
    },
    {
    "gameid":"5",
    "gameIcon":"https:\/\/xenzet.com\/GameCheat\/uploads\/doom.png",
    "Games_Name":"Doom Enternal"
    },
    {
    "gameid":"6",
    "gameIcon":"https:\/\/xenzet.com\/GameCheat\/uploads\/for.png",
    "Games_Name":"Fornite"
    },
    {
    "gameid":"9",
    "gameIcon":"https:\/\/xenzet.com\/GameCheat\/uploads\/dota2.png",
    "Games_Name":"dota2"
    }
]


5 commentaires

ajouter une erreur de Logcat


n'obtient pas d'erreur dans la méthode de mise à niveau, l'erreur concerne l'adaptateur recyclerview car le nombre d'éléments est nul.


déboguer et vérifier response.body () récupérer des données ou non.


obtenir le corps de la réponse dans le débogage uniquement, essayer sans débogage donne null.


s'il vous plaît vérifier si vous avez ajouté @SerializedName sur les données membres de votre Game.class, cette annotation aide la mise à niveau pour analyser les données json dans votre classe java.


3 Réponses :


0
votes

Ajoutez des données dans votre adaptateur dans la méthode side onResponse

ajoutez fetch_information () dans oncreate

@Override
        public void onResponse(Call<List<Games>> call, Response<List<Games>> response) {
            if(response.isSuccessful()) {
                gameslist = response.body();
                adapter = new GameRecyclerViewAdapter(MainActivity.this, gameslist); 
                //change your Activity name here insted of MainActivity
                recyclerView.setAdapter(adapter);
            }
        }


10 commentaires

aucun changement, je pense qu'il ne va pas à l'intérieur de la méthode OnRepsonse et OnFailure, le débogage essayé ne va pas à l'intérieur, ne fonctionne que vers le curseur en état de débogage, je suis entré dans la méthode de réponse et il remplit les données là-bas.


n'a pas fonctionné les données ne sont toujours pas trouvées, la liste de jeux est vide.


add gameslist = new ArrayList (); ci-dessus l'initialisation de l'adaptateur dans oncreate


je l'ai fait en haut de la classe. toujours pas d'amélioration


Vous avez l'url @Nikunj Paradva, pourquoi n'essayez-vous pas d'obtenir des données et si vous obtenez des résultats, vous pouvez publier tout ce que vous avez fait, si vous le pouvez aussi.


le problème n'est pas pour la réponse, votre liste n'est pas initialisée selon votre journal d'erreurs en question, alors initialisez votre arraylist dans oncreate puis après la passer à l'adaptateur


ne fonctionne pas et après avoir montré toast donne une erreur d'adaptateur d'ensemble de recycleview sur la référence d'objet nulle.


mettre à jour le code de la méthode fetch_information (), et ce qui se trouve sur la ligne 109


n'a pas changé, a également ajouté la classe recyclerview et quelle ligne 109, ne voyant pas le numéro de ligne ici.


dites-moi quelle ligne était 109? J'ai compilé votre code et j'ai obtenu une réponse avec succès.



0
votes

Le problème est que vous configurez votre adaptateur de liste dans onCreate (), où gameslist est toujours nul.

return gameslist == null ? 0 : gameslist.size()

Lorsque vous appelez la méthode setAdapter (), le recyclerView demandera à l'adaptateur le nombre d'éléments; et dans getItemCount () je suppose, vous avez quelque chose comme return gameslist.count (). Puisque la liste de jeux est toujours nulle, cela provoque le NPE.

Pour résoudre ce problème, remplacez getItemCount () par quelque chose comme ceci:

adapter = new GameRecyclerViewAdapter(this, gameslist);
recyclerView.setAdapter(adapter);

EDIT

J'ai vérifié votre URL (avec Postman), et il semble que le type de contenu de la réponse soit text / html et non application / json comme il se doit. Je suppose que la réponse n'est donc pas convertie à l'aide de Gson et que vous vous retrouvez donc avec null.


2 commentaires

oui vous avez raison cela résout l'erreur mais les données de réponse sont toujours nulles pourquoi?


Quelqu'un peut-il essayer d'obtenir ces données en utilisant l'URL de retrofit 2.



0
votes

Je n'ai pas vérifié où vous vous êtes trompé. Mais cette implémentation de code me renvoie une liste contenant 10 données dans la liste.

 private void viewGame() {
        Call<List<ViewGame>> call = APIClient.getInterface().viewgamesjson("https://xenzet.com/GameCheat/viewgamesjson.php");

        call.enqueue(new Callback<List<ViewGame>>() {
            @Override
            public void onResponse(Call<List<ViewGame>> call, Response<List<ViewGame>> response) {
                try {
                    Global.dismissProgress();

                    if (response.isSuccessful() && response.body() != null) {
                        Global.dismissProgress();

                        Global.printLog("size===", response.body().size() + "");

                    } else {
                        Global.dismissProgress();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    Global.dismissProgress();
                }
            }

            @Override
            public void onFailure(Call<List<ViewGame>> call, Throwable t) {
                Global.dismissProgress();
                try {
                    Global.showToast(SplashActivity.this, getString(R.string.something_wrong));
                } catch (Exception e) {
                    e.printStackTrace();
                }
                call.cancel();
                t.printStackTrace();
            }
        });
    }

Voici la classe de modèle:

public class APIClient {
    static Retrofit retrofit = null;

    public static String Base_URL = "https://xenzet.com/GameCheat/";


    public static APIInterface getInterface() {

        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

        OkHttpClient client = new OkHttpClient.Builder()
                .readTimeout(60, TimeUnit.SECONDS)
                .connectTimeout(60, TimeUnit.SECONDS)
                .addInterceptor(interceptor)
                .build();

        retrofit = new Retrofit.Builder()
                .baseUrl(Base_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .client(client)
                .build();

        return retrofit.create(APIInterface.class);
    }
}

Voici la classe APiClient:

public class ViewGame {
    String gameid,gameIcon,Games_Name;

    public String getGameid() {
        return gameid;
    }

    public void setGameid(String gameid) {
        this.gameid = gameid;
    }

    public String getGameIcon() {
        return gameIcon;
    }

    public void setGameIcon(String gameIcon) {
        this.gameIcon = gameIcon;
    }

    public String getGames_Name() {
        return Games_Name;
    }

    public void setGames_Name(String games_Name) {
        Games_Name = games_Name;
    }
}

Et voici l'API Call:

public interface APIInterface {

    @GET()
    Call<List<ViewGame>> viewgamesjson(@Url String url);

}


3 commentaires

@tim long - il y a peut-être un problème avec "@Expose" dans votre classe de modèle. Retirez-le et vérifiez-le à nouveau.


aucun n'a fonctionné pour moi et je n'ai aucune idée de quoi que ce soit, je pense que je fais tout bien


@timlong je vous fournit tout. Son fonctionne bien. Il y a peut-être quelque chose de mineur qui vous manque. Vous pouvez supprimer votre modèle et le régénérer à nouveau. Cela fonctionne également.