阅读 219

Android 资讯类App项目实战 第二章 retrofit获取网络数据

前言:

正在做一个资讯类app,打算一边做一边整理,供自己学习与巩固。用到的知识复杂度不高,仅适于新手。经验不多,如果写出来的代码有不好的地方欢迎讨论。

以往的内容 第一章 滑动顶部导航栏

第二章 获取网络数据

本章内容最终效果:

本章内容最终效果

知识点:

retrofit,okhttp,SwipeRefreshLayout,mvp模式

学习目标:

1、掌握Retrofit+OkHttp的结合使用。

2、用MVP模式完成代码的书写。

3、SwipeRefreshLayout下拉刷新数据。

通过各种Api获取网络数据时整个项目的基础,Retrofit+Okhttp的结合帮助我们更快完成网络请求的过程。

项目实战:

注意

本章用到的drawable资源、values资源皆存放在百度网盘

(请将values文件夹中的style.xml或color.xml更新一致后再运行,如有后续更新自行修改)

1.1 项目结构

本章内容完整的项目结构:

项目结构

需导入的库:

build.gradle

1.2 Retrofit

本章Retrofit的讨论可参考我的另一篇文章retrofit2+OkHttp3的初尝试 首先写一个Api类,用来存放Url。

Api.java

public class Api {
public static final String NEWS_HOST = "https://c.m.163.com/";

public static final String HEADLINE_ID = "T1348647909107";
public static final String NBA_ID = "T1348649145984";
public static final String JOKE_ID = "T1350383429665";
}
复制代码

本章用到的Api为网易新闻api: http://c.m.163.com/nc/article/headline/T1348647909107/0-20.html

属性类NewsBean用GsonFormat生成就行,在这里就不贴代码了,不懂得如何操作参考使用Gson和GsonFormat解析复杂Json

对了,由于网易新闻返回的数据里不同类型的新闻id会不同,所以使用一个NewsBean会有冲突,我的方法很笨,直接在NewsBean里写三个不同的get、set方法,所以需要大家在GsonFormat生成代码后再修改代码:

NewsBean

如果大家有更好的解决办法欢迎来讨论

观察本章用到的Api可以发现,这种Api需要前后拼接,那为什么我上面的Api类没有写END_URL来作为结尾呢?这里就体现了retrofit的强大之处了。

RetrofitService:

RetrofitService

我们看到retrofit本身就有url拼接功能,需要改变的参数也可以用{}来达到占位的效果。

接下来是RetrofitHelper:

RetrofitHelper

2.1 MVP模式

MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。

首先是M层 M层有两个接口:

INewsModel

INewsModel

IOnLoadListener

IOnLoadListener

然后是NewsModel类

2018-05-20_173507.jpg

V层有一个接口INewsView,用来规定fragment所有用到的方法

INewsView

P层的任务就是把M层和V层连接起来 首先是P层的接口

INewsPresenter

然后是NewsPresenter

NewsPresenter

2.2 Fragment显示数据

Fragment的修改主要是FgNewsListFragment有修改 FgNewsListFragment的布局加一个SwipeRefreshLayout,用于下拉刷新。

fg_news_list.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.v4.widget.SwipeRefreshLayout
    android:id="@+id/srl_news"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/tv_news"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="top"
        android:textSize="20sp" />
</android.support.v4.widget.SwipeRefreshLayout>

</LinearLayout>
复制代码

FgNewsListFragment:

FgNewsListFragment

记得加上网络权限

  <uses-permission android:name="android.permission.INTERNET"/>
复制代码

最终效果:

最终效果

任务

在FgMovieFragment里将豆瓣电影Api的数据提取并显示电影名称(title)和导演数组信息(directors)

api:https://api.douban.com/v2/movie/in_theaters 效果:

任务效果.gif

项目源码:https://github.com/Huigesi/IdleReader

上一章: 第一章 滑动顶部导航栏

下一章: 第三章 滑动顶部导航栏