安卓开发-获取知乎日报接口数据

内容纲要

获取知乎日报接口数据

导入依赖库

Gradle添加

//AsyncHttpClient网络请求框架
implementation 'com.loopj.android:android-async-http:1.4.10'
//Gson 解析Json文件
implementation 'com.google.code.gson:gson:2.8.6'

添加插件

插件市场搜索安装
GsonFormat插件,用于解析Json文本快速构建自定义类

接口地址

通过接口获取Json文本数据
http://news-at.zhihu.com/api/4/news/latest

在线http请求
ps:该api可直接在地址栏进行访问,无需http请求

构建自定义类

利用GsonFormat插件构建如下结构的类PostsInfo

package com.example.rjman.Item;

import java.util.List;

public class PostsInfo {
    private String date;
    private List<StoriesBean> stories;
    private List<TopStoriesBean> top_stories;

    public static class StoriesBean {
        /**
         * image_hue : 0x42372e
         * title : 你最喜欢的免费任天堂 Switch 游戏是什么?
         * url : https://daily.zhihu.com/story/9718278
         * hint : 疯癫的A兵者 · 4 分钟阅读
         * ga_prefix : 122320
         * images : ["https://pic3.zhimg.com/v2-f3c4c03f42b79898fa3e3006637ff152.jpg"]
         * type : 0
         * id : 9718278
         */
        private String image_hue;
        private String title;
        private String url;
        private String hint;
        private String ga_prefix;
        private int type;
        private int id;
        private List<String> images;
    }

    public static class TopStoriesBean {
        /**
         * image_hue : 0x404040
         * hint : 作者 / 司马懿
         * url : https://daily.zhihu.com/story/9718261
         * image : https://pic1.zhimg.com/v2-dddc3c426045bb2aff16155e3dd33380.jpg
         * title : 砍价的时候,假装走开有用么?
         * ga_prefix : 122307
         * type : 0
         * id : 9718261
         */
        private String image_hue;
        private String hint;
        private String url;
        private String image;
        private String title;
        private String ga_prefix;
        private int type;
        private int id;
    }
}

发起Http请求获取Json数据

相关变量声明

在全局声明一个List数组保存Http请求的结果
结合消息处理机制,用于规避多线程带来的数据同步问题

//接口地址
String url_path;
//保存http请求获取的数据
List<PostsInfo.StoriesBean> postsData;

初始化相关变量

private void initData() {
    //知乎日报接口地址
    url_path = "http://news-at.zhihu.com/api/4/news/latest";
    //创建List数组对象,用于保存http请求的数据
    postsData = new ArrayList<>();
    getNewsInfo(url_path);
}

用AsyncHttpClient发起Http请求

定义线程的完成状态

//Http请求成功则返回CHANGE_UI
private static final int CHANGE_UI = 1;
//请求失败则返回ERROR
private static final int ERROR = 2;

开启子线程

private void getNewsInfo(String url_path){
    //创建一个新AsyncHttpClient实例并发出请求
    AsyncHttpClient client = new AsyncHttpClient();
    //AsyncHttpClient中有get和post两种方法
    //子线程,第一个参数是所要获取接口,第二个参数是所发出的请求
    client.get(url_path, new AsyncHttpResponseHandler() {
        @Override
        public void onSuccess(int i, Header[] headers, byte[] bytes) {
            try {
                String json = new String(bytes,"utf-8");
                Gson gson = new Gson();
                PostsInfo postsInfo = gson.fromJson(json,PostsInfo.class);

                //将更改主界面的消息发给主线程
                Message msg = new Message();
                msg.what = CHANGE_UI;
                //保存所需的数据,传递回主线程
                msg.obj = postsInfo.getStories();
                handler.sendMessage(msg);

                Log.d("JSON","http get() succeed");
            }catch (Exception e){
                Log.d("JSON","catch e");
                e.printStackTrace();
            }
        }
        @Override
        public void onFailure(int i, Header[] headers, byte[] bytes, Throwable throwable) {
            ToastUtil.showToast(getApplicationContext(),"fail to resolve");

            Message msg = new Message();
            msg.what = ERROR;
            handler.sendMessage(msg);

        }
    });
}

主线程消息处理机制

通过传递的消息,保存子线程http请求所获得的数据,并根据请求的数据更新RecyclerView

//主线程创建消息处理机制
@SuppressLint("HandlerLeak")
private Handler handler = new Handler(){
    @Override
    public void handleMessage(android.os.Message msg) {
        if(msg.what == CHANGE_UI){
            //保存子线程请求获得的数据
            postsData = (List<PostsInfo.StoriesBean>) msg.obj;
            //根据请求的数据更新RecyclerView
            initView();
        }else if(msg.what == ERROR){
            ToastUtil.showToast(getApplicationContext(),"请求数据错误");
        }
    }
};

发表评论