开源库的使用介绍

更新时间:2016-04-11

Retroft

A type-safe HTTP client for Android and Java

举个栗子

// Request.class
public interface XKCDRequest {
  @GET("/info.0.json")
  XKCDResponse getLatestXKCD();
}
// Response.class
public class XKCDResponse {
  public int day;
  public int month;
  public int year;
  public String img;
}
// MainActivity.class
RestAdapter restAdapter = new RestAdapter.Builder()
    .setEndpoint("http://xkcd.com")
    .build();

XKCDResponse service = restAdapter.create(XKCDRequest.class);
// 然后就能取到相应的数据了

将 HTTP API 转换成 Java 接口

// GitHubService.class
public interface GitHubService {
  @GET("users/{user}/repos")
  Call<List<Repo>> listRepos(@Path("user") String user);
}
// MainActivity.class
Retroft retrofit = new Retroft.Builder()
    .baseUrl("https://api.github.com/")
    .build();
GitHubService service = retrofit.create(GitHubService.class);
// 同步或异步地调用
Call<List<Repo>> repos = service.listRepos("octocat");

使用 annotation 描述 HTTP 请求

  • 支持 URL 和 查询参数
  • 得到的数据可转换为多种格式
  • 多部分请求和文件上传

请求

支持 GET, POST, PUT, DELETE, HEAD 等,使用相对路径

@GET("users/list")
@GET("users/list?sort=desc")

支持定义 URL 路径,使用 @Path

@GET(group/{id}/users)
Call<List<User>> groupList(@Path("id") int groupId);

另外还支持添加查询变量,使用 @Query@QueryMap

@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);
// 对于复杂点的
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);

支持编码过的表单和多部分,分别使用 @FormUriEncoded@Multipart

@FormUriEncoded
@POST("user/edit")
// 每个键值对使用 @Field("keyname") value 形式
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);

@Multipart
@PUT("user/photo")
// 每个部分使用 @Part("name") value
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);

支持 Request Body,使用 @Body

@POST("users/new")
Call<User> createUser(@Body User user);

支持使用 @Headers 自定义静态 Header 和使用 @Header 动态添加

@Headers("Cache-Control: max-age=640000")
@GET("widget/list")
Call<List<Widget>> widgetList();
// 或
@Headers({
  "Accept: application/vnd.github.v3.full+json",
  "User-Agent: Retrofit-Sample-App"
})
@GET("users/{username}")
Call<User> getUser(@Path("username") String username);

// 动态添加
@GET("user")
Call<User> getUser(@Header("Authorization") String authorization);

转换器

默认情况下,Retrofit 会将响应的数据保存为 OkHttp 的 ResponseBody 类型。但也支持转换成 其他类型如:Gson, Jackson, Moshi, Protobuf, Wire, Simple XML, Scalars

举个栗子

Retrofit retrofit = new Retrofit.Builder()
  .baseUrl("https://api.github.com")
  .addConverterFactory(GsonConverterFactory.create())
  .build();

GitHubService service = retrofit.create(GitHubService.class);

参考

Picasso

A powerful image downloading and caching library for Android

举个栗子

Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);

特性

  • 处理 ImageView 的回收以及下载的取消
  • 使用尽可能小的内存使用处理复杂的图像传输
  • 自动地进行内存和磁盘缓存

自动检测重用的 adapter 和取消前一次下载

@Override public void getView(int position, View convertView, ViewGroup parent) {
  SquaredImageView view = (SquaredImageView) convertView;
  if (view == null) {
    view = new SquaredImageView(context);
  }
  String url = getItem(position);

  Picasso.with(context).load(url).into(view);
}

图像传输,另外也可以自定义,通过实现 Transformation 接口

Picasso.with(context)
  .load(url)
  .resize(50, 50)
  .centerCrop()
  .into(imageView)

显示缺省信息,当图像加载失败时有个提示作用

Picasso.with(context)
  .load(url)
  .placeholder(R.drawable.user_placeholder)
  .error(R.drawable.user_placeholder_error)
  .into(imageView);

支持从本地加载图像资源

Picasso.with(context).load(R.drawable.landing_screen).into(imageView1);
Picasso.with(context).load("file:///android_asset/DvpvklR.png").into(imageView2);
Picasso.with(context).load(new File(...)).into(imageView3);

参考

Tags

开源库

Tags

开源库