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

使用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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:42:46