android快捷開發之Retrofit網絡加載框架的簡單使用

大家都知道,安卓最大的特點就是開源化,這自然會產生很多十分好用的第三方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.0'

  

2)然后每一次使用都需要定義一個接口,用于下載網絡數據,注意其中的{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("/")//網址下面的子目錄Call<String> getBaidu();@GET("/api/{category}/list")//網址下面的子目錄   category表示分類,因為子目錄只有一點不一樣Call<Tngou> 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.0'

  

4)我們寫一個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 List<Cook> 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 List<Cook> getList() {return list;}public void setList(List<Cook> 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 version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="wrap_content"><ImageViewandroid:layout_width="70dp"android:layout_height="70dp"android:src="@mipmap/ic_launcher"android:id="@+id/item_iv"/><LinearLayoutandroid:layout_gravity="center_vertical"android:orientation="vertical"android:layout_weight="1"android:layout_width="0dp"android:layout_height="wrap_content"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="標題"android:textAppearance="@android:style/TextAppearance.Large"android:id="@+id/item_title"/><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:maxLines="2"android:text="abcabcacbacbacbacbacbacacacacacasdadasd"android:ellipsize="end"android:id="@+id/item_info"/></LinearLayout>
</LinearLayout>

  

6)主布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.example.nanchen.retrofitdemo.RetrofitJsonActivity"><ListViewandroid:id="@+id/json_lv"android:layout_width="match_parent"android:layout_height="match_parent"></ListView>
</RelativeLayout>

  

7)自定義適配器,其中又用到了他們的圖片加載框架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 List<Cook> list;
24 
25     public MyAdapter(Context context, List<Cook> 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/img"+cook.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 Callback<Tngou> {
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         Call<Tngou> 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(Call<Tngou> call, Response<Tngou> response) {
40         List<Cook> list = response.body().getList();
41         lv.setAdapter(new MyAdapter(this,list));
42     }
43 
44     @Override
45     public void onFailure(Call<Tngou> call, Throwable t) {
46 
47     }
48 }

最后上一波運行圖

?

?

?

?

2016年8月1日補充

————————————————————————————————————————————————

下面帶來一些2.0版本后需要注意的問題。

1)Retrofit ?2.0版本后趨向于在baseUrl中以“/”結尾,@Url不要以“/”開頭,這樣更專業。額,其實你還可以把整個地址放在接口中去,這樣baseUrl就忽略了。

1 Retrofit retrofit = new Retrofit.Builder().baseUrl("http://www.tngou.net/")
2                 .addConverterFactory(GsonConverterFactory.create()).build();

2)Retrofit的事務可以在之后立即取消,只需要調用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,啦啦啦。

5)oh,no,遇到服務器返回的時間格式很奇葩怎么辦?哈哈,其實你完全可以通過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代替,保證接口定義的簡潔。

另外,Query,Field和Part都支持數組和實現了Iterable接口的類型,如List,Set等,方便向后臺傳遞數組。

好了,這個強大的Retrofit就補充到這里了,大家可以自行補充。

?

轉載于:https://www.cnblogs.com/liushilin/p/5680135.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/286996.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286996.shtml
英文地址,請注明出處:http://en.pswp.cn/news/286996.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何線性求乘法逆元

ny[i](ny[p%i]*(p-p/i))%p;不如背一發板子&#xff1f;轉載于:https://www.cnblogs.com/paozi/p/7788640.html

打開計算機無法顯示工具欄,任務欄不顯示打開的窗口怎么辦教程

我們在使用電腦的時候&#xff0c;打開很多程序的時候&#xff0c;會最小化某些窗口&#xff0c;只留在用的窗口&#xff0c;而最小化都是縮小為一個圖標放入屏幕下方的任務欄的&#xff0c;但有時候不知道為什么任務欄不顯示打開的窗口了&#xff0c;這時候也就無法直接用鼠標…

rsync文件同步、Inotify-tools參數詳解

inotifywait用于等待文件或文件集上的一個待定事件&#xff0c;可以監控任何文件和目錄設置&#xff0c;并且可以遞歸地監控整個目錄樹&#xff1b; inotifywatch用于收集被監控的文件系統計數據&#xff0c;包括每個inotify事件發生多少次等信息從上面可知inotifywait是一個…

ArcGIS 10.6提取道路中心線的兩種方法經典教程

我們工作中碰到的道路數據通常為面狀,需要提取道路中心線,本文講解ArcGIS10.6中從面狀道路數據中提取道路中心線的兩種常用經典方法。 方法一:使用ArcGIS 10.6提供的提取道路中心線工具 本實驗中使用到面狀數據如下所示: 首先,將面狀數據轉為線狀數據。 轉完之后,道路盡頭…

衡量計算機浮點數操作性能,計算機系統基礎:計算機性能評價知識筆記

1、計算機性能常用的性能評測方法1.1 時鐘頻率計算機的時鐘頻率可以反映出機器的運行速度。一般主頻越高&#xff0c;速度越快。1.2 指令執行速度加法指令執行速度是衡量計算機性能指標的重要指標之一。1.3 等效指令速度法隨著計算機指令系統發展&#xff0c;種類越來越多&…

Android之用HttpURLConnection斷點下載谷歌云存儲(google cloud storage)文件

1 需求 在Android app里面實現斷點下載谷歌云存儲(google cloud storage)文件,也就是說用戶下載谷歌云存儲(google cloud storage)文件的時候可以暫停下載,后續可以再繼續下載 測試的圖片谷歌云的下載地址:https://storage.googleapis.com/keepdrop/common_dev/file-6fb695ac…

python 寫游戲好簡單啊,我用鍵盤可以隨意控制角色了【python 游戲實戰 04】

前言 本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋了新手在學習中的一般問題。此系列將會持續更新&#xff0c;包括別的語言以及實戰都將使用對話的方式進行教學&#xff0c;基礎編程語言教學適用于零基礎小白&#xff0c;之后實戰課程也將會逐步更新…

ASP.NET登錄以及注冊

數據模型&#xff1a; 1 public class Model2 {3 public Model()4 {5 //6 // TODO: 在此處添加構造函數邏輯7 //8 }9 private string _Ucode; 10 /// <summary> 11 /// 賬號 12 /// </summary> 13 public…

樹形表的平行查詢設計

本文由網友長空X投稿&#xff0c;歡迎轉載、分享原文作者&#xff1a;長空X&#xff08;CSDN同名“長空X“&#xff0c;CkTools的作者&#xff0c;github: https://github.com/hjkl950217&#xff09;原文鏈接&#xff1a;https://www.cnblogs.com/gtxck/articles/16293295.htm…

Ubuntu 16.04安裝SQLite Browser操作SQLite數據庫

安裝&#xff1a; sudo apt-get install sqlitebrowser 啟動&#xff1a;

ArcGIS10從入門到精通系列實驗視頻教程合集(持續更新)

全集視頻請點擊&#xff1a;《ArcGIS10.X從入門到精通系列實驗教程》

(13)python 字典 2 分鐘速解

本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋了新手在學習中的一般問題。此系列將會持續更新&#xff0c;包括別的語言以及實戰都將使用對話的方式進行教學&#xff0c;基礎編程語言教學適用于零基礎小白&#xff0c;之后實戰課程也將會逐步更新。 若…

Kotlin之函數作為參數傳遞

1 、Kotlin之函數作為參數傳遞 我們在寫BaseQuickAdapter適配器的時候,有時候嵌套多個BaseQuickAdapter,如果最里面的view觸發點擊事件,我們可以把函數作為參數通過構造函數一層一層傳遞進去。 2、代碼測試 private var test: (Boolean, Int, Int) -> Unit = {result, a…

計算機繪畫作品 星空,關于近期繪畫作品《星空系列》的自述:

《星空系列》是一個很偶然的念想下產生的&#xff0c;但又絕非偶然。最開初的點是高一剛開始學畫的時候&#xff0c;高中的老師給我們免費提供油畫材料給我們練習&#xff0c;那時候我并沒有“安分”地練習高考繪畫&#xff0c;總想做一些關于自己想法的作品&#xff0c;那時候…

BootStrap導航欄的使用

默認的導航欄 創建一個默認的導航欄的步驟如下&#xff1a; 向 <nav> 標簽添加 class .navbar、.navbar-default。向上面的元素添加 role"navigation"&#xff0c;有助于增加可訪問性。向 <div> 元素添加一個標題 class .navbar-header&#xff0c;內部包…

安裝SQL Server 2005時,出現“SQL Server 服務無法啟動。……”提示的解決方法

安裝SQL Server 2005時&#xff0c;出現“SQL Server 服務無法啟動。……”提示的解決方法上午在自己XP SP3電腦上安裝SQL Server 2005時出現如下提示&#xff1a; 根據這一情況&#xff0c;我把自己的解題步驟寫下來和大家分享&#xff0c;雖然簡單了些&#xff0c;可是安裝的…

.NET MAUI 正式發布,再見了 Xamarin.Forms

David Ortinau 在dotnet 團隊博客上發表了一篇文章《Introducing .NET MAUI – One Codebase, Many Platforms》&#xff0c;在這篇文章里宣布了MAUI的正式發布。https://github.com/dotnet/maui/releases/tag/6.0.312 https://devblogs.microsoft.com/dotnet/introducing-dotn…

南京師范大學湯國安教授《地理信息與人類生活》系列精品課程(5集全)

《地理信息與人類生活》湯國安老師公共課&#xff08;5集全&#xff09; 人類掌握與應用地理信息的歷史&#xff0c;從一個側面反映了人類社會的發展進程。在數字化的時代&#xff0c;地理信息技術更是滲透到人類生活的方方面面。本課程通過五節課程的講解&#xff0c;展示了地…

利用SQL注入獲取服務器最高權限

單位有臺數據庫服務器&#xff08;windows 2000 操作系統&#xff0c;sql server 2000&#xff09;前段時間莫名其妙的被***了跑到機房&#xff0c;通過PE進去一看&#xff0c;發現多了一個賬戶&#xff08;SQLDEBUG)。并且administrator賬戶被禁用了看看數據沒少&#xff0c;也…

3分鐘搞定 C++ if else 語句 05

作者簡介 作者名&#xff1a;1_bit 簡介&#xff1a;CSDN博客專家&#xff0c;2020年博客之星TOP5&#xff0c;藍橋簽約作者。15-16年曾在網上直播&#xff0c;帶領一批程序小白走上程序員之路。歡迎各位小白加我咨詢我相關信息&#xff0c;迷茫的你會找到答案。系列教程將會…