You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 21:17:30