編輯:關於Android編程
什麼是 Retrofit ?
Retrofit 是一套 RESTful架構的Android(Java) 客戶端實現,基於注解,提供 JSON to POJO(Plain OrdinaryJavaObject ,簡單 Java 對象),POJO to JSON,網絡請求(POST,GET, PUT,DELETE 等)封裝。
在build.gradle中添加
..... //編譯RxJava compile 'io.reactivex:rxjava:1.1.6' //編譯RxAndroid compile 'io.reactivex:rxandroid:1.2.1' //編譯Retrofit及其相關庫,包括Gson compile 'com.squareup.okhttp3:okhttp:3.3.1' compile 'com.squareup.retrofit2:retrofit:2.1.0' compile 'com.squareup.retrofit2:converter-gson:2.1.0' compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0' compile 'com.squareup.okhttp3:logging-interceptor:3.3.1'
說明:
Retrofit默認依賴於okhttp,所以需要集成okhttp。
API返回的數據為JSON格式,在此我使用的是Gson對返回數據解析.請使用最新版的Gson 。
這裡我們調試借助百度名人名言API
該接口的API主機地址為:http://apistore.baidu.com;
需要訪問的接口:avatardata/mingrenmingyan/lookup;
需要一個key等於apikey的Header和一個keyword等於名人名言的查詢關鍵字,而且該請求為GET請求.
接口返回json格式:
{
"total": 10,
"result": [
{
"famous_name": "佚名",
"famous_saying": "婚姻是一家私人專門銀行,存儲真愛和默契,提取幸福和快樂。夫妻雙方互為賬戶,且存折是活期的,可以隨存隨取,而家庭則是這家銀行裡的櫃台,通過它,夫妻雙方可以把自己的喜怒哀樂盡情地存進對方的銀行裡,並可隨時提取微笑、鼓勵、安慰、體貼、溫柔等利息。"
},
{
"famous_name": "英國",
"famous_saying": "真愛無坦途"
},
{
"famous_name": "狄太人",
"famous_saying": "一個人真愛的時候,甚至會想不到自己是愛著對方。"
},
{
"famous_name": "佚名",
"famous_saying": "所有的阻礙,全是對真愛的淬煉。"
},
{
"famous_name": "羅蘭",
"famous_saying": "當你真愛一個人的時候,你是會忘記自己的苦樂得失,而只是關心對方的苦樂得失的。"
},
{
"famous_name": "羅蘭",
"famous_saying": "當兩人之間有真愛情的時候,是不會考慮到年齡的問題,經濟的條件,相貌的美丑,個子的高矮,等等外在的無關緊要的因素的。假如你們之間存在著這種問題,那你要先問問自己,是否真正在愛才好。"
},
{
"famous_name": "佚名",
"famous_saying": "真正的勇氣是來自內心的真愛。"
},
{
"famous_name": "佚名",
"famous_saying": "天國般的幸福,存在於對真愛的希望。"
},
{
"famous_name": "狄太人",
"famous_saying": "一個人真愛的時候,甚至會想不到自己是愛著對方"
},
{
"famous_name": "Shakespeare",
"famous_saying": "通向真愛的路從無坦途。"
}
],
"error_code": 0,
"reason": "Succes"
}
我們根據上面API返回的json數據來創建一個Famous數據對象,我們可以利用AndroidStudio插件 GsonFormat 快速方便的將json數據轉為Java 對象。
Famous.java
public class Famous {
//下面變量的定義要與接口中的字段名字保持一致
public int total;
public int error_code;
public String reason;
public List result;
public static class FamousInfo {
public String famous_name;
public String famous_saying;
}
}
注意:如果你的字段有跟json不一樣的,要在字段上面加注解@SerializedName,@SerializedName是指定Json格式中的Key名。
如上面的錯誤碼字段,你就像定義為code,而服務器返回的是error_code,這個時候就應該這麼寫:
@SerializedName("error_code")
public int code;
首先定義
public abstract class BaseApi {
public static final String API_SERVER = "服務器地址"
private static final OkHttpClient mOkHttpClient = new OkHttpClient();
private static Retrofit mRetrofit;
protected static Retrofit getRetrofit() {
if (Retrofit == null) {
Context context = Application.getInstance().getApplicationContext();
//設定30秒超時
mOkHttpClient.setConnectTimeout(30, TimeUnit.SECONDS);
//設置攔截器,以用於自定義Cookies的設置
mOkHttpClient.networkInterceptors()
.add(new CookiesInterceptor(context));
//設置緩存目錄
File cacheDirectory = new File(context.getCacheDir()
.getAbsolutePath(), "HttpCache");
Cache cache = new Cache(cacheDirectory, 20 * 1024 * 1024);
mOkHttpClient.setCache(cache);
//構建Retrofit
mRetrofit = new Retrofit.Builder()
//配置服務器路徑
.baseUrl(API_SERVER + "/")
//設置日期解析格式,這樣可以直接解析Date類型
.setDateFormat("yyyy-MM-dd HH:mm:ss")
//配置轉化庫,默認是Gson
.addConverterFactory(GsonConverterFactory.create())
//配置回調庫,采用RxJava
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
//設置OKHttpClient為網絡客戶端
.client(mOkHttpClient)
.build();
}
return mRetrofit;
}
}
定義FamousApi
public class FamousApi extends BaseApi{
//定義接口
private interface FamousService {
@GET("/avatardata/mingrenmingyan/lookup")
Observable getFamousList(@Header("apiKey") String apiKey,
@Query("keyword") String keyword,
@Query("page") int page,
@Query("rows") int rows);
}
protected static final FamousService service = getRetrofit().create(FamousService.class);
public static Observable getFamousList(String apiKey,String keyword, int page, int rows){
return service.getFamousList(apiKey, keyword, page, rows);
}
}
最終使用:
public void getFamousList(){
FamousApi.getFamousList("apiKey","人才",1,20)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber(){
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Famous famous) {
List list = famous.result;
//填充UI
}
});
}
參考demo:https://github.com/jdsjlzx/RetrofitDemo
android的activity跳轉到另一個activity
開發環境:android4.1.1實驗功能:在第一個Hello World!為標簽的activity中顯示good,該界面中有一個名為Next的按鈕。點擊Next按鈕進入
Android開發實例之登錄界面的實現
本文要演示的Android開發實例是如何完成一個Android中的miniTwitter登錄界面,下面將分步驟講解怎樣實現圖中的界面效果,讓大家都能輕松的做出美觀的登錄界
Android學習筆記——Menu介紹(二)
知識點:這次將繼續上一篇文章沒有講完的Menu的學習,上下文菜單(Context menu)和彈出菜單(Popup menu)。上下文菜單上下文菜單提供對UI界面上的特定
全面解析Android中對EditText輸入實現監聽的方法
在 Android design support 包中提供了一種在輸入不合適字符時一直顯示的提示方式來顯示,現在已經開始在更多的應用上被使用了;這些 Android ap