美文网首页
Retrofit+Rxjava+okhttp《一》

Retrofit+Rxjava+okhttp《一》

作者: alialiali | 来源:发表于2017-04-19 20:29 被阅读0次

    参考链接,自我总结一下,退出伸手党!
    下载利器
    https://github.com/Tamicer/FastDownloader
    RxAndroid之Rxlifecycle使用
    http://blog.csdn.net/jdsjlzx/article/details/51527542
    深入理解Java:注解(Annotation)自定义注解入门
    http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html
    http://gank.io/post/56e80c2c677659311bed9841
    https://tamicer.github.io/2016/08/10/novate10/
    http://blog.csdn.net/wzgiceman/article/details/51939574
    Retrofit:
    1.首先确保在AndroidManifest.xml中请求了网络权限
    <uses-permission android:name="android.permission.INTERNET"/>
    2.在app/build.gradle添加引用
    /rx-android-java/
    compile 'com.trello:rxlifecycle:1.0'//生命周期
    compile 'com.trello:rxlifecycle-components:1.0'
    /rotrofit/
    compile 'io.reactivex:rxjava:1.1.0'
    compile 'io.reactivex:rxandroid:1.1.0'
    compile 'com.squareup.retrofit2:retrofit:2.0.2'
    compile 'com.squareup.retrofit2:converter-gson:2.0.2'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2'
    compile 'com.google.code.gson:gson:2.6.2'
    compile 'com.jakewharton:butterknife:7.0.1'
    3.常用注解
    @Query、@QueryMap:用于Http Get请求传递参数
    @Field:用于Post方式传递参数,需要在请求接口方法上添加
    @FormUrlEncoded,即以表单的方式传递参数
    @Body:用于Post,根据转换方式将实例对象转化为对应字符串传递参数.
    比如Retrofit添加GsonConverterFactory则是将body转化为gson字符串进行传递
    @Path:用于URL上占位符
    @Part:配合@Multipart使用,一般用于文件上传
    @Header:添加http header
    @Headers:跟@Header作用一样,只是使用方式不一样,@Header是作为请求方法的参数传入,@Headers是以固定方式直接添加到请求方法上
    举例:
    <1>:如果想用表单 @FieldMap
    @FormUrlEncoded
    @POST("/url")
    Call<T> postForm(@FieldMap Map<String , Object> maps);
    <2>:如果直接用对象 @Body
    @POST("url")
    Call<T> PostBody(@Body Objects objects);
    <3>:如果直接多参数 @QueryMap
    @PUT("/url")
    Call<T> queryMap(@QueryMap Map<String, String> maps);
    <4>:如果上传文件 @Part
    @Multipart
    @POST("/url")
    Call<ResponseBody> uploadFlie(@Part("description") RequestBody description,
    @Part("files") MultipartBody.Part file);
    <5>:如果多文件上传 @PartMap()
    @Multipart
    @POST("{url}")
    Call<T> uploadFiles(@Path("url") String url,
    @PartMap() Map<String, RequestBody> maps);

    常规问题

    《一》 url被转义:
    http://api.myapi.com/http%3A%2F%2Fapi.mysite.com%2Fuser%2Flist
    需要将@path改成@url
    public interface APIService {
    @GET Call<Users> getUsers(@Url String url);
    }
    或者:
    public interface APIService {
    @GET("{fullUrl}")
    Call<Users> getUsers(@Path(value = "fullUrl", encoded = true) String fullUrl);
    }
    《二》Method方法找不到
    java.lang.IllegalArgumentException: Method must not be null
    请指定具体请求类型@get @post等
    public interface APIService {
    @GET Call<Users> getUsers(@Url String url);
    }
    《三》Url编码不对,@fieldMap parameters must be use FormUrlEncoded
    如果用fieldMap加上FormUrlEncoded编码
    @POST()
    @FormUrlEncoded
    Observable<ResponseBody> executePost(@FieldMap Map<String, Object> maps);
    上层需要转换将自己的map转换为FieldMap
    @FieldMap(encoded = true) Map<String, Object> parameters,
    《四》paht和url一起使用
    Using @Path and @Url paramers together with retrofit2
    java.lang.IllegalArgumentException: @Path parameters may not be used with @Url. (parameter #4
    如果你是这样的:
    @GET
    Call<DataResponse> getOrder(@Url String url,@Path("id") int id);
    请在你的url指定占位符.url:
    www.myAPi.com/{Id}
    4.注解(Annotation)自定义注解入门
    元注解:元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。
    Java5.0定义的元注解:
    1.@Target,2.@Retention,3.@Documented,4.@Inherited
    《一》@Target:
    @Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。
      作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
      取值(ElementType)有:
        1.CONSTRUCTOR:用于描述构造器
        2.FIELD:用于描述域
        3.LOCAL_VARIABLE:用于描述局部变量
        4.METHOD:用于描述方法
        5.PACKAGE:用于描述包
        6.PARAMETER:用于描述参数
        7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
    《二》@Retention:
      @Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。
      作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)
      取值(RetentionPoicy)有:
        1.SOURCE:在源文件中有效(即源文件保留)
        2.CLASS:在class文件中有效(即class保留)
        3.RUNTIME:在运行时有效(即运行时保留)

    《三》@Documented:
      @Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。
    《四》@Inherited:
      @Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
      注意:@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。
      当@Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,则反射API增强了这种继承性。如果我们使用java.lang.reflect去查询一个@Inherited annotation类型的annotation时,反射代码检查将展开工作:检查class和其父类,直到发现指定的annotation类型被发现,或者到达类继承结构的顶层。

    相关文章

      网友评论

          本文标题:Retrofit+Rxjava+okhttp《一》

          本文链接:https://www.haomeiwen.com/subject/gkwhzttx.html