参考链接,自我总结一下,退出伸手党!
下载利器
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类型被发现,或者到达类继承结构的顶层。
网友评论