从零开始Gank客户端开发之一

一直以来都感觉自己只会看代码,解决bug,总是觉得自己能力有限,想做一些程序性的开发,但总是做到一半就戛然而止。这次终于鼓起勇气来从零开始做一款客户端程序,一切从零开始。

由于从来没有做过相应的开发,不敢说自己怎么组织架构,怎么设计项目等,都是随着项目慢慢的深入,一步步发掘项目功能,然后不断改进的结果。这个系列的文章,权当是某人的思路。

数据

首先我先想到的不是界面,而是数据,数据从什么地方来,应该怎么使用?很显然我们这个项目使用的是干活集中营的API,具体可以看http://gank.io/api

由于是网络数据,很自然就想到了okHttp了,当然你可能想到了RxJava+Retrofit,可是为了从基本入手,我就选择了okHttp了。

先简单装一下okHttp
  1. 导入okHttp包
    只需在Gradle下添加如下依赖即可:
compile 'com.squareup.okhttp3:okhttp:3.6.0'
  1. 创建Manager类
    我这里创建的是GankHttpManager.java,这里我将其改为单例类型。
private static GankHttpManager mInstance;
private GankHttpManager() {
 }
public static GankHttpManager getInstance() {
        if(mInstance == null) {
            synchronized (GankHttpManager.class) {
                if(mInstance == null) {
                    mInstance = new GankHttpManager();
                }
            }
        }
        return mInstance;
    }

当然GankHttpManage不可能这么简单,既然是封装okHttp,当然得需要OkHttpClient,解析数据也需要Gson,这些一并在构造方法中初始化即可:

private OkHttpClient mHttpClient;
private Handler mHandler;
private Gson mGson;
private GankHttpManager() {
        mHttpClient = new OkHttpClient();
        mHandler = new Handler(Looper.getMainLooper());
        mGson = new Gson();
 }

这样我们的GankHttpManager就封装好了。现在我们要做的事情就是通过Gson来解析数据了。
通过查看干活集中营的Api,可以发现暂时我们需要的Api有两种类型,1. 每日数据;2.分类数据。通过查看json数据可以发现这两种Api的数据有些不一样。

每日数据(http://gank.io/api/day/年/月/日)

我们先来看一下json数据

//省略号代表后面的重复性内容省略
{
  "category": [
    "Android", ...
  ], 
  "error": false, 
  "results": {
    "Android": [
      {
        "_id": "590af3b3421aa90c7fefdd3c", ...
      }, ...
     ],...
   }
}

如果用Gson进行解析那么我们应该怎样去构建对象呢?
可以看到整个json包含三个大括号,如果我们把大括号代表一个层级的话,那么就比较好分析了,
1.首先构建一个对象包含三个参数,category,error,results。那么最外层也就分析完了,
2.其次再看category,该对象中又包含中括号,那么我们可以将之看作为一个List。再看results,你会发现其和包含的内容和外层类似,可以把整个的result看做一个对象。这时你可能又郁闷了,如果把里面的每一个看做一个对象,但是对象里的内容又是重复的,这怎么解决呢?其实可以把result看做是几个不同的List就可以了。
经过简单的分析那么我开始构建我们的数据吧。首先构建的是最里层相似的内容。我将之封装为Gank对象。

public class Gank{
    public String _id;
    public Date createdAt;
    public String desc;
    public Date publishedAt;
    public String source;
    public String type;
    public String url;
    public boolean used;
    public String who;
}

也可以加上@SerializedName的注解,来标明对应json的数据。

做完上面的工作,我们就可以来封装整个json了,我将之封装为DailyGank对象

public class DailyGank {
    @SerializedName("category") public List<String> category;
    @SerializedName("error") public boolean error;
    @SerializedName("results") public Result result;

    public class Result {
        @SerializedName("福利") public List<Gank> welfareList;
        @SerializedName("Android") public List<Gank> androidList;
        @SerializedName("iOS") public List<Gank> iosList;
        @SerializedName("拓展资源") public List<Gank> extraList;
        @SerializedName("前端") public List<Gank> frontList;
        @SerializedName("瞎推荐") public List<Gank> casualList;
        @SerializedName("App") public List<Gank> appList;
        @SerializedName("休息视频") public List<Gank> videoList;
    }
}

这样我们就封装了每日数据的json对象,那么下面我们来封装分类对象

分类对象(http://gank.io/api/data/数据类型/请求个数/第几页)

同样,我们可以看一下json数据

{
  "error": false, 
  "results": [
    {
      "_id": "590af3b3421aa90c7fefdd3c",...
    }, ...
   ]
}

可以看到和上面的数据有一点出入,也有相似点。我就不介绍了。直接看封装ClassifyGank

public class ClassifyGank {
    @SerializedName("error") public boolean error;
    @SerializedName("results") public List<Gank> classifyGank;
}

或者我们可以将DailyGank和ClassifyGank中共有的属性error给封装到BaseGank中,然后继承。不这样也没有关系。

既然我们的json数据已经分析清楚了,那么就可以在GankHttpManager中来获取并解析数据了。主要写两个方法,分别获取每日数据和分类数据

public void getClassifyGank(String url, final GankHttpListener listener) {
        Request request = new Request.Builder().url(url).build();
        mHttpClient.newCall(request)
                .enqueue(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {

                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        final String body = response.body().string();
                        mHandler.post(new Runnable() {
                            @Override
                            public void run() {
                                ClassifyGank data = mGson.fromJson(body,ClassifyGank.class);
                                // TODO: 处理数据 
                            }
                        });
                    }
                });
    }
public void getDailyGank(String url, final GankHttpListener listener){
        Request request = new Request.Builder().url(url).build();
        mHttpClient.newCall(request)
                .enqueue(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {

                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        final String body = response.body().string();
                        mHandler.post(new Runnable() {
                            @Override
                            public void run() {
                                DailyGank data = mGson.fromJson(body,DailyGank.class);
                                // TODO: 处理数据
                            }
                        });
                    }
                });
    }

代码中有一段注释是用来处理数据用的,看见了吗?在我们传入方法的地方都有一个listener,那个就是用来进行回调的方法,以便我们得到数据后进行处理。后面会介绍该listener怎么去定义。


这次就先讲到这里,下面一节讲解Gank客户端的主界面。拜拜!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,009评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,808评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,891评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,283评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,285评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,409评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,809评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,487评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,680评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,499评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,548评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,268评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,815评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,872评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,102评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,683评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,253评论 2 341

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,333评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,573评论 18 139
  • 参考Android网络请求心路历程Android Http接地气网络请求(HttpURLConnection) 一...
    合肥黑阅读 21,225评论 7 63
  • 参考资源 官网 国内博客 GitHub官网 鉴于一些关于OKHttp3源码的解析文档过于碎片化,本文系统的,由浅入...
    风骨依存阅读 12,461评论 11 82
  • 敦煌!我向往的地方!
    莫愁2016阅读 222评论 0 0