单读学习-网络框架搭建

概述

单读 APP的网络框架部分采用 Dagger2+Retrofit2.0 + Rxjava模式, 网络框架的初始化在 Application中,请先了解 Dagger2的简单在

引入依赖

Retrofit2.0 + Rxjava的依赖

build.gradle(app) 分别引入Retrofit2.0 和 Rxjava 的依赖

compile 'io.reactivex:rxjava:1.0.14'
compile 'io.reactivex:rxandroid:1.0.1'
compile 'com.squareup.retrofit2:retrofit:2.1.0'

compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'

依赖

Dagger2 依赖的引入,请参考Dagger2初探

引入权限

AndroidManifest.xml中引入 网络权限 以及存储等权限






日志模块

日志采用的是Logger日志库,详情围观Github地址

新建 MyApplication,在Oncreate中初始化日志模块如下:

private void initLogger() {
        // 日志策略
        FormatStrategy formatStrategy = PrettyFormatStrategy.newBuilder()
                .tag("tuionf")
                .build();
        //初始化
        Logger.addLogAdapter(new AndroidLogAdapter(formatStrategy));
    }

网络框架搭建

先看一下单读APP中网络的使用模式 : SplashPresenter.java 中的getSplash() 方法

apiService.getSplash("android","1.3.0",time,deviceId)
        .subscribeOn(Schedulers.io())
        .observeOn(Schedulers.io())
        .subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
                Logger.e("load splash onCompleted");
            }

            @Override
            public void onError(Throwable e) {
                Logger.e("load splash Error"+e.toString());
            }

            @Override
            public void onNext(SplashEntity splashEntity) {
                
        });

直接使用的 apiService 来调用网络请求的方法,也就是说我们网络框架搭建完成的标志就是对外提供一个 apiService 对象,单读中使用的是Dagger2 来处理的,所以需要对Dagger2 有一定的了解。不了解的请参考Dagger2初探 ,其实按照最简单的例子大概敲一边,能跑起来就可以继续往下看了。

创建ApiService实例

public interface ApiService {}

如代码所示,ApiService 是一个接口,可以在里面实现网络请求的方法,我们先暂时不写。

创建Module—NetModule

在Dagger2中 Module的作用就是提供生成依赖对象的,在此处就是提供 ApiService的,在 di\module 目录下创建 NetModule.java 。 (没有di\module 目录的话请创建)

  • 该类需要用 @Module 注解
@Module
public class NetModule {
  
}
  • 需要提供 ApiService 对象,就需要先提供一个方法来提供该对象 ,同时需要以参数形式传入 Retrofit 实例,以便创建网络请求的实例
    • 该方法需要 @Provides 注解,表明需要提供这样一个实例
    • 该方法需要 @Singleton 注解,表明需要提供的是一个单例
  • 创建 ApiService对象,需要 Retrofit 实例,所以需要提供方法创建 Retrofit 实例
  • 同理,需要提供方法创建 OkHttpClient实例

NetModule.java 完整代码如下:

@Module
public class NetModule {

    public static final String BASE_URL = "http://static.owspace.com/";

    @Provides
    @Singleton
    public OkHttpClient provideOkHttpClient(){
        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
        loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient client = new OkHttpClient.Builder()
                .connectTimeout(30, TimeUnit.SECONDS)
                .connectTimeout(20, TimeUnit.SECONDS)
                .readTimeout(20,TimeUnit.SECONDS)
                .addInterceptor(loggingInterceptor)
                .build();
        return client;
    }

    @Provides
    @Singleton
    public Retrofit provideRetrofit(OkHttpClient client){
        Retrofit retrofit = new Retrofit.Builder()
                .client(client)
                .baseUrl(BASE_URL)
                .addConverterFactory(StringConverterFactory.create())
                .addConverterFactory(GsonConverterFactory.create(EntityUtils.gson))//
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
        return retrofit;
    }

    @Provides
    @Singleton
    public ApiService provideApiService(Retrofit retrofit){
        return retrofit.create(ApiService.class);
    }
}

创建Component—NetComponent

NetComponent 是一个接口, 用@Singleton @Component注解标注,同时 modules 依赖上面刚刚创建的 NetModule.class,代码如下

NetComponent.java

@Singleton
@Component (modules = NetModule.class)
public interface NetComponent {
    ApiService getApiService();
}

Make Project

在 androidstudio中 build—Make Project,或者直接快捷键 Ctrl+F9,编译完成之后会生出 以 Dagger 开头的 Component,比如,我们上面写的是 **NetComponent **,生成了类名就为 DaggerNetComponent。这个类我们可以直接使用

获取 ApiService实例

MyApplication中,使用上面生成的 DaggerNetComponent

private void initNet() {
    netComponent = DaggerNetComponent.builder()
            .netModule(new NetModule())
            .build();
}

至此,网络层的搭建就算基本完成了,接下来我们会用这个实例来调用API获得数据

使用网络实例

创建启动图的bean

http://static.owspace.com/static/picture_list.txt?client=android&version=1.3.0&time=1467864021&device_id=866963027059338

根据上述接口,可以获得启动图的返回数据 ,根据数据创建

SplashEntity.java

public class SplashEntity {

    private int count;
    private String status;
    private int time;
    private List images;

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public int getTime() {
        return time;
    }

    public void setTime(int time) {
        this.time = time;
    }

    public List getImages() {
        return images;
    }

    public void setImages(List images) {
        this.images = images;
    }
}

构建网络请求

public interface ApiService {
   
    @GET("static/picture_list.txt")
    Observable getSplash(@Query("client") String client,@Query("version") String version,@Query("time") Long time,@Query("device_id") String deviceId);
    
    }

你可能感兴趣的:(单读学习-网络框架搭建)