Android应用无法加载MySQL数据且无报错,求修复方案
嘿,我仔细看了你的代码,找到了几个导致RecyclerView不显示数据且没报错的关键问题,下面是具体的排查点和修复方案:
1. 初始化顺序错误,导致初始Adapter绑定空数据
你在onCreate里先创建Adapterdata并设置给RecyclerView,但这时候list_data还没初始化(list_data = new ArrayList<HashMap<String, String>>();是后面才执行的),而且网络请求还没返回数据。这会导致RecyclerView一开始绑定的是空列表,虽然后面请求回来会重新设置Adapter,但这种写法容易出现隐性异常,而且效率不高。
修复代码:
把Adapter的初始化和设置逻辑调整,先初始化空列表,创建初始Adapter后,等网络请求返回数据时只通知Adapter更新,而不是重新创建Adapter:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); String url = "http://192.168.1.9/uasazizah/android.php"; mRecyclerView = findViewById(R.id.bararecy); mRecyclerView.setHasFixedSize(true); mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); // 先初始化空的列表 list_data = new ArrayList<HashMap<String, String>>(); // 创建初始Adapter并绑定到RecyclerView Adapterdata adapterdata = new Adapterdata(MainActivity.this, list_data); mRecyclerView.setAdapter(adapterdata); requestQueue = Volley.newRequestQueue(MainActivity.this); stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() { @Override public void onResponse(String response) { Log.d("response ", response); try { JSONObject jsonObject = new JSONObject(response); JSONArray jsonArray = jsonObject.getJSONArray("azizah"); // 先清空旧数据(如果需要) list_data.clear(); for (int a = 0; a < jsonArray.length(); a++) { JSONObject json = jsonArray.getJSONObject(a); HashMap<String, String> map = new HashMap<String, String>(); map.put("code", json.getString("code")); map.put("groupname", json.getString("groupname")); map.put("namag", json.getString("namag")); list_data.add(map); } // 数据加载完成后,通知Adapter更新UI adapterdata.notifyDataSetChanged(); } catch (JSONException e) { e.printStackTrace(); // 给用户提示解析错误,方便调试和感知 Toast.makeText(MainActivity.this, "数据解析失败:" + e.getMessage(), Toast.LENGTH_SHORT).show(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // 优化错误提示,避免null指针(error.getMessage()可能为null) String errorMsg = error.getMessage() != null ? error.getMessage() : "网络请求失败,请检查网络或服务器"; Toast.makeText(MainActivity.this, errorMsg, Toast.LENGTH_SHORT).show(); } }); requestQueue.add(stringRequest); }
2. 网络请求错误处理不严谨
原代码中error.getMessage()可能返回null,导致Toast无法正常显示;而且没有明确的错误提示,你很难知道是网络不通还是服务器接口的问题。上面的修复已经优化了这部分,确保用户能看到清晰的错误信息。
3. 数据解析异常无用户提示
原代码中JSON解析出错只会在日志里打印,你作为开发者能看到,但用户完全不知道发生了什么。修复中添加了解析错误的Toast提示,方便调试和用户感知。
4. 可选优化:用实体类替代HashMap(更安全易维护)
用HashMap存储数据很容易出现键名拼写错误(比如namag写错成nameg就会导致数据为空),建议创建Modeldata实体类来存储数据,类型更安全,代码也更易读:
创建Modeldata实体类:
public class Modeldata { private String code; private String groupname; private String namag; public Modeldata(String code, String groupname, String namag) { this.code = code; this.groupname = groupname; this.namag = namag; } // Getter方法 public String getCode() { return code; } public String getGroupname() { return groupname; } public String getNamag() { return namag; } }
修改MainActivity中的列表和解析逻辑:
// 替换HashMap列表为Modeldata列表 ArrayList<Modeldata> mItems = new ArrayList<>(); // 创建Adapter时传入这个列表 Adapterdata adapterdata = new Adapterdata(MainActivity.this, mItems); // 网络请求解析部分 for (int a = 0; a < jsonArray.length(); a++) { JSONObject json = jsonArray.getJSONObject(a); String code = json.getString("code"); String groupname = json.getString("groupname"); String namag = json.getString("namag"); mItems.add(new Modeldata(code, groupname, namag)); } adapterdata.notifyDataSetChanged();
修改Adapterdata类:
public class Adapterdata extends RecyclerView.Adapter<Adapterdata.ViewHolder> { Context context; ArrayList<Modeldata> list_data; // 改为Modeldata列表 public Adapterdata(MainActivity mainActivity, ArrayList<Modeldata> list_data) { this.context = mainActivity; this.list_data = list_data; } @Override public void onBindViewHolder(ViewHolder holder, int position) { Modeldata data = list_data.get(position); DrawableCrossFadeFactory factory = new DrawableCrossFadeFactory.Builder().setCrossFadeEnabled(true).build(); Glide.with(context) .load("http://192.168.1.9/uasazizah/images/" + data.getNamag()) .transition(withCrossFade()) .apply(new RequestOptions().override(100, 100) .placeholder(R.drawable.ic_launcher_background) .error(R.drawable.ic_launcher_background).centerCrop() ) .into(holder.img); holder.txtkate.setText(data.getGroupname()); holder.tkscode.setText(data.getCode()); } @Override public int getItemCount() { return list_data == null ? 0 : list_data.size(); } // ViewHolder部分不变 public class ViewHolder extends RecyclerView.ViewHolder { TextView txtkate,tkscode; ImageView img; public ViewHolder(View itemView) { super(itemView); txtkate = itemView.findViewById(R.id.namatvv); tkscode = itemView.findViewById(R.id.code); img = itemView.findViewById(R.id.imgv); } } }
额外调试建议
- 查看
Log.d("response ", response)的输出,确认PHP接口返回的JSON格式是否正确,是否包含azizah数组,以及每个字段(code、groupname、namag)是否存在。 - 确保手机和服务器在同一局域网内,用手机浏览器打开
http://192.168.1.9/uasazizah/android.php,检查是否能正常返回JSON数据。 - 确认AndroidManifest.xml中添加了网络权限:
<uses-permission android:name="android.permission.INTERNET" />
内容的提问来源于stack exchange,提问作者Azizah

