使用Volley请求JSON:Android获取服务器SQLite数据技术问询
嘿,我来帮你搞定这个Android端获取并解析PHP接口JSON的问题~
首先看你现有代码里的一个核心问题:网络请求是异步操作,你在initDataset()里调用getArticles()后立刻打印mDataset.size(),这时候请求还没完成,列表肯定还是空的,这是新手很容易踩的坑。下面给你完整的实现思路和代码示例:
完整解决方案
1. 核心思路
- 网络请求必须在子线程执行,避免阻塞主线程(Android强制要求)
- 必须在请求完成的回调里解析JSON并更新数据集,再通知UI刷新
2. 代码实现(两种主流方式)
方式一:基础HttpURLConnection + AsyncTask
适合不想引入第三方库的场景:
// 先定义文章实体类,对应你的SQLite表字段 public class Article { private int id; private String title; private String content; // Getter & Setter public int getId() { return id; } public void setId(int id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } } // 你的页面类里的核心代码 private ArrayList<Article> mDataset; private void initDataset() { mDataset = new ArrayList<>(); Log.d("InitDataset", "初始列表大小: " + mDataset.size()); // 启动异步网络请求 new FetchArticlesTask().execute("你的PHP接口完整URL"); } // 异步任务:负责网络请求和结果回调 private class FetchArticlesTask extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... urls) { String jsonResult = ""; HttpURLConnection connection = null; try { URL url = new URL(urls[0]); connection = (HttpURLConnection) url.openConnection(); // 读取输入流转换为字符串 InputStream inputStream = new BufferedInputStream(connection.getInputStream()); jsonResult = convertStreamToString(inputStream); } catch (IOException e) { e.printStackTrace(); } finally { if (connection != null) connection.disconnect(); } return jsonResult; } @Override protected void onPostExecute(String jsonString) { super.onPostExecute(jsonString); // 回到主线程解析JSON并更新数据集 parseJsonToArticles(jsonString); Log.d("InitDataset", "请求完成后列表大小: " + mDataset.size()); // 这里可以刷新UI,比如通知RecyclerView更新数据 } // 流转字符串工具方法 private String convertStreamToString(InputStream is) { BufferedReader reader = new BufferedReader(new InputStreamReader(is)); StringBuilder sb = new StringBuilder(); String line; try { while ((line = reader.readLine()) != null) { sb.append(line).append("\n"); } } catch (IOException e) { e.printStackTrace(); } finally { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } return sb.toString(); } } // JSON解析方法:将接口返回的JSON转换为Article对象列表 private void parseJsonToArticles(String jsonString) { try { // 假设你的PHP接口返回格式是 {"articles": [{"id":1, "title":"xxx", ...}, ...]} JSONObject rootObj = new JSONObject(jsonString); JSONArray articlesArray = rootObj.getJSONArray("articles"); for (int i = 0; i < articlesArray.length(); i++) { JSONObject articleObj = articlesArray.getJSONObject(i); Article article = new Article(); article.setId(articleObj.getInt("id")); article.setTitle(articleObj.getString("title")); article.setContent(articleObj.getString("content")); // 根据你的SQLite表字段,继续添加其他属性赋值 mDataset.add(article); } } catch (JSONException e) { e.printStackTrace(); Log.e("JsonParseError", "解析失败: " + e.getMessage()); } }
方式二:使用OkHttp(更简洁推荐)
先在build.gradle中添加依赖:
implementation 'com.squareup.okhttp3:okhttp:4.10.0'
然后实现代码:
private void initDataset() { mDataset = new ArrayList<>(); Log.d("InitDataset", "初始列表大小: " + mDataset.size()); fetchArticlesWithOkHttp("你的PHP接口完整URL"); } private void fetchArticlesWithOkHttp(String url) { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder().url(url).build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { e.printStackTrace(); // 请求失败时回到主线程提示用户 runOnUiThread(() -> Toast.makeText(getApplicationContext(), "网络请求失败", Toast.LENGTH_SHORT).show() ); } @Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful() && response.body() != null) { String jsonString = response.body().string(); // 解析和更新UI必须回到主线程 runOnUiThread(() -> { parseJsonToArticles(jsonString); Log.d("InitDataset", "请求完成后列表大小: " + mDataset.size()); // 刷新UI操作 }); } } }); } // 同样使用上面的parseJsonToArticles方法和Article实体类
关键注意事项
- 权限申请:在
AndroidManifest.xml中添加网络权限:<uses-permission android:name="android.permission.INTERNET" /> - JSON结构匹配:确保PHP接口返回的JSON格式和你解析逻辑一致,如果接口直接返回JSON数组(而非包裹在JSONObject里),则直接用
JSONArray articlesArray = new JSONArray(jsonString)解析。
内容的提问来源于stack exchange,提问作者Yohann L.
相关产品推荐
相关产品推荐

