怎么制作网站主页,天津网站建设行业新闻,wordpress百万文章,免费网站后台模板下载大家都知道#xff0c;安卓最大的特点就是开源化#xff0c;这自然会产生很多十分好用的第三方API#xff0c;而基本每一个APP都会与网络操作和缓存处理机制打交道#xff0c;当然#xff0c;你可以自己通过HttpUrlConnection再通过返回数据进行解析解决#xff0c;而我们… 大家都知道安卓最大的特点就是开源化这自然会产生很多十分好用的第三方API而基本每一个APP都会与网络操作和缓存处理机制打交道当然你可以自己通过HttpUrlConnection再通过返回数据进行解析解决而我们自己学的东西大多数情况下都没有针对网络很糟糕的情况进行优化。下面就给大家带来Square Inc这家有创新精神的公司留下的Retrofit网络加载库的使用 项目已经同步至github:https://github.com/nanchen2251/retrofitDemo Retrofit封装了从Web API下载数据解析成一个普通的java对象POJO这里我们就去天狗网使用他们的一个菜谱的API做简单演示供大家一起学习思考。在天狗网的API文档网站http://www.tngou.net/doc/cook的菜谱API接口http://www.tngou.net/api/cook/list 详细使用 1首先得添加支持包 compile com.squareup.retrofit2:retrofit:2.1.02然后每一次使用都需要定义一个接口用于下载网络数据注意其中的{category}是为了之后更好的扩展性我们定义一个未知的子目录通过参数中指定可以访问固定的子目录这个方式非常棒。 package com.example.nanchen.retrofitdemo;import com.example.nanchen.retrofitdemo.json.Tngou;import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Path;
import retrofit2.http.Query;/*** Created by 南尘 on 16-7-15.*/
public interface Service {GET(/)//网址下面的子目录CallString getBaidu();GET(/api/{category}/list)//网址下面的子目录 category表示分类因为子目录只有一点不一样CallTngou getList(Path(category) String path,Query(id) int id, Query(page) int page, Query(rows) int rows);
}3由于我们返回的数据为Json数据所以我们可以用它本身自带的Gson解析方式进行返回数据的解析同样先导入支持包 compile com.squareup.retrofit2:converter-gson:2.1.04我们写一个DataBean用于存放返回的数据 package com.example.nanchen.retrofitdemo.json;import com.google.gson.annotations.SerializedName;import java.util.List;/*** Created by 南尘 on 16-7-15.*/
public class Tngou {//加上注解SerializedName(status)private boolean status;SerializedName(total)private int total;SerializedName(tngou)private ListCook list;public boolean isStatus() {return status;}public void setStatus(boolean status) {this.status status;}public int getTotal() {return total;}public void setTotal(int total) {this.total total;}public ListCook getList() {return list;}public void setList(ListCook list) {this.list list;}
}里面要放List, 是一个类所以要新建一个类。 package com.example.nanchen.retrofitdemo.json;import com.google.gson.annotations.SerializedName;/*** 菜谱* Created by 南尘 on 16-7-15.*/
public class Cook {SerializedName(id)private int id;SerializedName(name)private String name;//名称SerializedName(food)private String food;//食物SerializedName(img)private String img;//图片SerializedName(images)private String images;//图片,SerializedName(description)private String description;//描述SerializedName(keywords)private String keywords;//关键字SerializedName(message)private String message;//资讯内容SerializedName(count)private int count;//访问次数SerializedName(fcount)private int fcount;//收藏数SerializedName(rcount)private int rcount;//评论读数public int getId() {return id;}public void setId(int id) {this.id id;}public String getName() {return name;}public void setName(String name) {this.name name;}public String getFood() {return food;}public void setFood(String food) {this.food food;}public String getImg() {return img;}public void setImg(String img) {this.img img;}public String getImages() {return images;}public void setImages(String images) {this.images images;}public String getDescription() {return description;}public void setDescription(String description) {this.description description;}public String getKeywords() {return keywords;}public void setKeywords(String keywords) {this.keywords keywords;}public String getMessage() {return message;}public void setMessage(String message) {this.message message;}public int getCount() {return count;}public void setCount(int count) {this.count count;}public int getFcount() {return fcount;}public void setFcount(int fcount) {this.fcount fcount;}public int getRcount() {return rcount;}public void setRcount(int rcount) {this.rcount rcount;}
}5我们做一个简单演示把返回并解析的数据放在ListView里面显示所以自定义一个显示Item的Xml文件 ?xml version1.0 encodingutf-8?
LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:orientationhorizontalandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentImageViewandroid:layout_width70dpandroid:layout_height70dpandroid:srcmipmap/ic_launcherandroid:idid/item_iv/LinearLayoutandroid:layout_gravitycenter_verticalandroid:orientationverticalandroid:layout_weight1android:layout_width0dpandroid:layout_heightwrap_contentTextViewandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:text标题android:textAppearanceandroid:style/TextAppearance.Largeandroid:idid/item_title/TextViewandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:maxLines2android:textabcabcacbacbacbacbacbacacacacacasdadasdandroid:ellipsizeendandroid:idid/item_info//LinearLayout
/LinearLayout6主布局 ?xml version1.0 encodingutf-8?
RelativeLayoutxmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:contextcom.example.nanchen.retrofitdemo.RetrofitJsonActivityListViewandroid:idid/json_lvandroid:layout_widthmatch_parentandroid:layout_heightmatch_parent/ListView
/RelativeLayout7自定义适配器其中又用到了他们的图片加载框架picasso我们在一个项目中最好都用一个团队的框架这样才会让出错的几率大大降低。 当然别忘了添加支持包 compile com.squareup.picasso:picasso:2.3.2再是Adapter 1 package com.example.nanchen.retrofitdemo.json;2 3 import android.content.Context;4 import android.view.LayoutInflater;5 import android.view.View;6 import android.view.ViewGroup;7 import android.widget.BaseAdapter;8 import android.widget.ImageView;9 import android.widget.TextView;
10
11 import com.example.nanchen.retrofitdemo.R;
12 import com.squareup.picasso.Picasso;
13
14 import java.util.Collection;
15 import java.util.List;
16
17 /**
18 * Created by 南尘 on 16-7-15.
19 */
20 public class MyAdapter extends BaseAdapter {
21
22 private Context context;
23 private ListCook list;
24
25 public MyAdapter(Context context, ListCook list) {
26 this.context context;
27 this.list list;
28 }
29
30 Override
31 public int getCount() {
32 if (list ! null){
33 return list.size();
34 }
35 return 0;
36 }
37
38 Override
39 public Object getItem(int position) {
40 return list.get(position);
41 }
42
43 Override
44 public long getItemId(int position) {
45 return position;
46 }
47
48 Override
49 public View getView(int position, View convertView, ViewGroup parent) {
50 if (convertView null){
51 convertView LayoutInflater.from(context).inflate(R.layout.list_item,parent,false);
52 convertView.setTag(new ViewHolder(convertView));
53 }
54 ViewHolder holder (ViewHolder) convertView.getTag();
55 Cook cook list.get(position);
56 holder.tv_title.setText(cook.getName());
57 holder.tv_info.setText(cook.getDescription());
58 //使用同样开发团队的Picasso支持包进行图片加载由于接口中返回的img路径不是全的所以需要加上网站前缀
59 Picasso.with(context).load(http://tnfs.tngou.net/imgcook.getImg()).into(holder.iv);
60 return convertView;
61 }
62
63 public void addAll(Collection? extends Cook collection){
64 list.addAll(collection);
65 notifyDataSetChanged();
66 }
67
68 public static class ViewHolder{
69 private final ImageView iv;
70 private final TextView tv_title;
71 private final TextView tv_info;
72
73 public ViewHolder(View item){
74 iv ((ImageView) item.findViewById(R.id.item_iv));
75 tv_title ((TextView) item.findViewById(R.id.item_title));
76 tv_info ((TextView) item.findViewById(R.id.item_info));
77 }
78 }
79 } 8再看看Activity的代码 1 package com.example.nanchen.retrofitdemo;2 3 import android.os.Bundle;4 import android.support.v7.app.AppCompatActivity;5 import android.widget.ListView;6 7 import com.example.nanchen.retrofitdemo.json.Cook;8 import com.example.nanchen.retrofitdemo.json.MyAdapter;9 import com.example.nanchen.retrofitdemo.json.Tngou;
10
11 import java.util.List;
12
13 import retrofit2.Call;
14 import retrofit2.Callback;
15 import retrofit2.Response;
16 import retrofit2.Retrofit;
17 import retrofit2.converter.gson.GsonConverterFactory;
18
19 public class RetrofitJsonActivity extends AppCompatActivity implements CallbackTngou {
20
21
22 private ListView lv;
23
24 Override
25 protected void onCreate(Bundle savedInstanceState) {
26 super.onCreate(savedInstanceState);
27 setContentView(R.layout.activity_retrofit_json);
28
29 Retrofit retrofit new Retrofit.Builder().baseUrl(http://www.tngou.net)
30 .addConverterFactory(GsonConverterFactory.create()).build();
31 Service service retrofit.create(Service.class);
32 CallTngou call service.getList(cook,0, 1, 20);
33 call.enqueue(this);
34 lv (ListView) findViewById(R.id.json_lv);
35
36 }
37
38 Override
39 public void onResponse(CallTngou call, ResponseTngou response) {
40 ListCook list response.body().getList();
41 lv.setAdapter(new MyAdapter(this,list));
42 }
43
44 Override
45 public void onFailure(CallTngou call, Throwable t) {
46
47 }
48 } 最后上一波运行图 2016年8月1日补充 ———————————————————————————————————————————————— 下面带来一些2.0版本后需要注意的问题。 1Retrofit 2.0版本后趋向于在baseUrl中以“/”结尾Url不要以“/”开头这样更专业。额其实你还可以把整个地址放在接口中去这样baseUrl就忽略了。 1 Retrofit retrofit new Retrofit.Builder().baseUrl(http://www.tngou.net/)
2 .addConverterFactory(GsonConverterFactory.create()).build(); 2Retrofit的事务可以在之后立即取消只需要调用call.cancel即可好简单哈哈。 3官方提供了好几种ConverterFactory适合你的才是最好的自己去选择吧~ Gson: com.squareup.retrofit:converter-gson Jackson: com.squareup.retrofit:converter-jackson Moshi: com.squareup.retrofit:converter-moshi Protobuf: com.squareup.retrofit:converter-protobuf Wire: com.squareup.retrofit:converter-wire Simple XML: com.squareup.retrofit:converter-simplexml 4额你还可以选择实现Converter.Factory接口来自定义一个converter啦啦啦。 5ohno遇到服务器返回的时间格式很奇葩怎么办哈哈其实你完全可以通过GsonBuilder().create()创建一个gson对象作为Converter的参数来实现自定义Gson对象呀。 1 //需要使用的时候放到GsonConverterFactory.create(gson)中作为参数即可。
2 Gson gson new GsonBuilder().setDateFormat(yyyy-MM-dd HH:mm:ss).create();
3
4
5
6 Retrofit retrofit new Retrofit.Builder().baseUrl(http://www.tngou.net/)
7 .addConverterFactory(GsonConverterFactory.create(gson)).build(); 6之前有的小伙伴会问为什么我们在Demo中用call.enqueue而没有用execute这是因为我们一般都选择用enqueue这样会默认在异步线程中执行少写一个线程何乐而不为呢 7额之前Demo没有对Retrofit 2.0 的注解方式进行完善的整理这里给大家带来一些更详细的东西。 8首先带来http的请求方法 我们一般常用的就是GET请求和POST请求当然你或许会用到http的其他注解方式值得注意的是HTTP注解方式可以涵盖上面的任意一种注解。 而它有三个属性method,path,hasBody。 9再带来标记类 额上面的这个表单请求我相信在post请求中用的不少吧你值得尝试。 10当然就少不了我们的参数类咯图片来源于网络。 这里值得注意的是 {占位符}和path都尽量出现在Url的path部分url中的参数使用Query和QueryMap代替保证接口定义的简洁。 另外QueryField和Part都支持数组和实现了Iterable接口的类型如ListSet等方便向后台传递数组。 好了这个强大的Retrofit就补充到这里了大家可以自行补充。 转载于:https://www.cnblogs.com/liushilin/p/5680135.html