使用 retrofit2 在响应体上获取空数据?

我是 retrofit 2 的新手,我正在尝试获取 json 数组数据,但结果为空,这是获取数据的 url。


但有趣的是,当我尝试在内部进行调试时,onResponse我得到了成功消息和response.body数据。这里有什么问题?


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


这是json数据


[

    {

        "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"

    }

]

这是试图获取数据的方法


 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();

            }

        });


    }


蓝山帝景
浏览 210回答 3
3回答

红糖糍粑

在 onResponse 方法中的适配器中添加数据fetch_information()在oncreate中添加@Override&nbsp; &nbsp; &nbsp; &nbsp; public void onResponse(Call<List<Games>> call, Response<List<Games>> response) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(response.isSuccessful()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; gameslist = response.body();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; adapter = new GameRecyclerViewAdapter(MainActivity.this, gameslist);&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //change your Activity name here insted of MainActivity&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; recyclerView.setAdapter(adapter);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }

噜噜哒

我没有检查你在哪里弄错了。但是此代码实现返回列表中包含 10 个数据的列表。public interface APIInterface {&nbsp; &nbsp; @GET()&nbsp; &nbsp; Call<List<ViewGame>> viewgamesjson(@Url String url);}这是模型类:public class ViewGame {&nbsp; &nbsp; String gameid,gameIcon,Games_Name;&nbsp; &nbsp; public String getGameid() {&nbsp; &nbsp; &nbsp; &nbsp; return gameid;&nbsp; &nbsp; }&nbsp; &nbsp; public void setGameid(String gameid) {&nbsp; &nbsp; &nbsp; &nbsp; this.gameid = gameid;&nbsp; &nbsp; }&nbsp; &nbsp; public String getGameIcon() {&nbsp; &nbsp; &nbsp; &nbsp; return gameIcon;&nbsp; &nbsp; }&nbsp; &nbsp; public void setGameIcon(String gameIcon) {&nbsp; &nbsp; &nbsp; &nbsp; this.gameIcon = gameIcon;&nbsp; &nbsp; }&nbsp; &nbsp; public String getGames_Name() {&nbsp; &nbsp; &nbsp; &nbsp; return Games_Name;&nbsp; &nbsp; }&nbsp; &nbsp; public void setGames_Name(String games_Name) {&nbsp; &nbsp; &nbsp; &nbsp; Games_Name = games_Name;&nbsp; &nbsp; }}这是 APiClient 类:public class APIClient {&nbsp; &nbsp; static Retrofit retrofit = null;&nbsp; &nbsp; public static String Base_URL = "https://xenzet.com/GameCheat/";&nbsp; &nbsp; public static APIInterface getInterface() {&nbsp; &nbsp; &nbsp; &nbsp; HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();&nbsp; &nbsp; &nbsp; &nbsp; interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);&nbsp; &nbsp; &nbsp; &nbsp; OkHttpClient client = new OkHttpClient.Builder()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .readTimeout(60, TimeUnit.SECONDS)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .connectTimeout(60, TimeUnit.SECONDS)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .addInterceptor(interceptor)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .build();&nbsp; &nbsp; &nbsp; &nbsp; retrofit = new Retrofit.Builder()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .baseUrl(Base_URL)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .addConverterFactory(GsonConverterFactory.create())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .client(client)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .build();&nbsp; &nbsp; &nbsp; &nbsp; return retrofit.create(APIInterface.class);&nbsp; &nbsp; }}这是 API 调用:&nbsp;private void viewGame() {&nbsp; &nbsp; &nbsp; &nbsp; Call<List<ViewGame>> call = APIClient.getInterface().viewgamesjson("https://xenzet.com/GameCheat/viewgamesjson.php");&nbsp; &nbsp; &nbsp; &nbsp; call.enqueue(new Callback<List<ViewGame>>() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void onResponse(Call<List<ViewGame>> call, Response<List<ViewGame>> response) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Global.dismissProgress();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (response.isSuccessful() && response.body() != null) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Global.dismissProgress();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Global.printLog("size===", response.body().size() + "");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Global.dismissProgress();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } catch (Exception e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Global.dismissProgress();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void onFailure(Call<List<ViewGame>> call, Throwable t) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Global.dismissProgress();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Global.showToast(SplashActivity.this, getString(R.string.something_wrong));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } catch (Exception e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; call.cancel();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t.printStackTrace();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; }

沧海一幻觉

问题是,您在 onCreate() 中设置了列表适配器,其中gameslist仍然为空。adapter&nbsp;=&nbsp;new&nbsp;GameRecyclerViewAdapter(this,&nbsp;gameslist); recyclerView.setAdapter(adapter);当你调用 setAdapter() 方法时,recyclerView 会向适配器询问项目的数量;我想在 getItemCount() 中,你有类似 return gameslist.count() 的东西。由于游戏列表仍然为空,这会导致 NPE。要修复它,请将 getItemCount() 更改为如下所示:return&nbsp;gameslist&nbsp;==&nbsp;null&nbsp;?&nbsp;0&nbsp;:&nbsp;gameslist.size()编辑我检查了您的 URL(使用 Postman),似乎响应的内容类型text/html不application/json正确。我想因此没有使用 Gson 转换响应,因此您最终得到 null。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java