Retrofit學(xué)習(xí)筆記

Retrofit學(xué)習(xí)筆記

一、什么是Retrofit框架

  • Retrofit框架是Square公司出品的目前非常流行的網(wǎng)絡(luò)請(qǐng)求框架檩帐、效率高厚骗、實(shí)現(xiàn)簡(jiǎn)單。運(yùn)用注解和動(dòng)態(tài)代理,極大的簡(jiǎn)化了網(wǎng)絡(luò)請(qǐng)求的繁瑣步奏蒋失,非常適合處理REST FUL網(wǎng)絡(luò)請(qǐng)求返帕,

特點(diǎn)

  • 性能好、處理快篙挽、使用簡(jiǎn)單荆萤。目前安卓最為流行的HTTP Client庫(kù)之一(速度上聽說比volley更快)
  • 使用REST API非常方便
  • 支持NIO(新的IO API,可以替代標(biāo)準(zhǔn)的Java IO API)
  • Retrofit默認(rèn)使用OKHttp處理網(wǎng)絡(luò)請(qǐng)求
  • 默認(rèn)使用GSON解析

Retrofit2中網(wǎng)絡(luò)訪問常用注解接口

  • @GET GET網(wǎng)絡(luò)請(qǐng)求方式
  • @PSOT PSOT網(wǎng)絡(luò)請(qǐng)求方式
  • @Headers 頭信息參數(shù)
  • @Path 路徑參數(shù)铣卡。替換url地址中"{"和"}"所包括的部分
  • @Query 查詢參數(shù)观腊,將在地址url中追加類似"page=1"的字符串,形成提交給服務(wù)器端的請(qǐng)求參數(shù)
  • @QueryMap 查詢參數(shù)集合算行,在url地址中追加類似"type=text&count=30&page=1"的字符串
  • @FormUrlEncoded 對(duì)表單域中填寫內(nèi)容進(jìn)行編碼處理,避免亂碼
  • @Field 指定form表單域中每個(gè)空間的name及相應(yīng)的數(shù)值
  • @FieldMap 表單域集合
  • @Multipart Post提交分塊請(qǐng)求苫耸,如果上傳文件州邢,必須指定Multipart
  • @Part POST提交分塊請(qǐng)求
  • @Body POST提交分塊請(qǐng)求

Retrofit2代碼實(shí)現(xiàn)步驟

五部曲

  • 1、定義一個(gè)接口(封裝URL地址和數(shù)據(jù)請(qǐng)求)
  • 2褪子、實(shí)例化Retrofit
  • 3量淌、通過Retrofit實(shí)例創(chuàng)建接口服務(wù)對(duì)象
  • 4、接口服務(wù)對(duì)象調(diào)用接口中方法嫌褪,獲得call對(duì)象
  • 5呀枢、Call對(duì)象執(zhí)行請(qǐng)求(異步、同步請(qǐng)求)

Retrofit2 GET網(wǎng)絡(luò)請(qǐng)求中接口方法

  • 1笼痛、GET請(qǐng)求裙秋,方法中無(wú)參數(shù)
@GET("article/list/latest?page")
Call<ResponseBody> getLatestString();
  • 2、GET請(qǐng)求缨伊,方法中指定@Path參數(shù)和@Query參數(shù)摘刑。@Path用于替換url地址中"{"和"}"所包括的部分。@Query將在url地址中追加類似"page=1"的字符串刻坊,形成提交給服務(wù)器端的請(qǐng)求參數(shù)
@GET("article/list/{type}?")
Call<QiushiModel> getLatesList(@Path("type")) String type,@Query("page") int page);
  • 3枷恕、GET請(qǐng)求,提交表單數(shù)據(jù)谭胚,方法中定義@QueryMap參數(shù)徐块。 @QueryMap參數(shù)將在url地址中追加類似"type=text*count=308&page=1"的字符串
@GET ("MyWeb/RegServlet")
Call<ResponseBody> getKeyValuePair(@QueryMap Map<String,String> map);
  • 4、GET請(qǐng)求灾而,方法中無(wú)參數(shù) 但是在@Url里面定義完整URL路徑胡控,這種情況下BaseUrl會(huì)被忽略
@GET("http://img.234g.com/userup/112/12.jpg")
Call<ResponseBody> getNetWorkData();

簡(jiǎn)單使用(不使用Rx)

基地址
 public final static String BASE_URL = "http://m2.qiushibaike.com/";
接口方法
    @GET("article/list/latest?page=1")
    Call<ResponseBody> getLatestJsonString();
創(chuàng)建接口的工廠
public class ServerFactory {

    public static <T> T createServiceFactory(final Class<T> serverClass, String url) {

        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.connectTimeout(10, TimeUnit.SECONDS);

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(url)
                .client(builder.build())
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        return retrofit.create(serverClass);
    }
}
數(shù)據(jù)的請(qǐng)求
 private void initData() {
        MyServerInterface serverInterface = ServerFactory.createServiceFactory(MyServerInterface.class, Constant.BASE_URL);
        Call<ResponseBody> call = serverInterface.getLatestJsonString();
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                // I/yinlei: -------ThreadId------>1  證明返回來的數(shù)據(jù)是在主線程中的
                Log.i("yinlei", "-------ThreadId------>" + Thread.currentThread().getId());
                if (response.isSuccess()) {
                    String result = null;
                    try {
                        result = response.body().string();
                        try {
                            JSONObject resultObject = new JSONObject(result);
                            int errCode = resultObject.getInt("err");
                            if (errCode == 0) {
                                JSONArray items = resultObject.getJSONArray("items");
                                // Toast.makeText(MainActivity.this, items.toString(), Toast.LENGTH_SHORT).show();
                                for (int i = 0; i < items.length(); i++) {
                                    PageBean.ItemsBean item = new Gson().fromJson(items.getString(i), new TypeToken<PageBean.ItemsBean>() {
                                    }.getType());
                                    mItemsBeen.add(item);
                                }
                            }
                            mTvResult.setText(result);
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
            }
        });
    }
結(jié)果就是json字符串
http://m2.qiushibaike.com/article/list/latest?page=1(如果想看結(jié)果,可以打開這個(gè)鏈接)

使用RxJava+Retrofit請(qǐng)求數(shù)據(jù)

URL地址
public final static String USER_URL = "https://api.github.com";
接口方法
    //獲取個(gè)人信息
    @GET("/users/JakeWharton")
    Observable<User> getUserDataObservable();
返回接口的工廠類
public class ServerFactoryObserver {

    public static <T> T createServiceFactory(final Class<T> serverClass, String url) {
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.connectTimeout(10, TimeUnit.SECONDS);

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(url)
                .client(builder.build())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        return retrofit.create(serverClass);
    }
}
數(shù)據(jù)請(qǐng)求
 MyServerInterface serverInterface = ServerFactoryObserver.createServiceFactory(MyServerInterface.class, Constant.USER_URL);
        serverInterface.getUserDataObservable()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<User>() {
                    @Override
                    public void onCompleted() {
                        mDialog.dismiss();
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(User user) {
                        Log.d("UserActivity", user.toString());
                        updateUi(user);
                    }
                });
小問題說明
  //這個(gè)獲取JackWharton大神的圖片貌似有點(diǎn)問題  地址是獲取到了绰疤,但是加載不出來
            //通過網(wǎng)頁(yè)加載url是可以獲取的铜犬,這里用了一張網(wǎng)絡(luò)圖片地址,是可以正常加載的,暫時(shí)不明什么原因
            String conver_url = mUser.getAvatar_url();
            Picasso.with(this).load("http://pic29.nipic.com/20130508/9252150_163600489317_2.jpg").placeholder(R.mipmap.ic_launcher)
                    .into(mIvConver);
演示(貌似我的AS出了問題癣猾,所有的字符編碼已經(jīng)UTF-8了敛劝,但是提示我編碼錯(cuò)誤(之前沒有的))

Github地址:

https://github.com/wuyinlei/RetrofitDemo

總結(jié)

這里只是簡(jiǎn)單的使用了retrofit,后面會(huì)對(duì)retrofit進(jìn)行簡(jiǎn)單的封裝纷宇,加入Rx夸盟。今天就到這了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末像捶,一起剝皮案震驚了整個(gè)濱河市上陕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拓春,老刑警劉巖释簿,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異硼莽,居然都是意外死亡庶溶,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門懂鸵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來偏螺,“玉大人,你說我怎么就攤上這事匆光√紫瘢” “怎么了?”我有些...
    開封第一講書人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵终息,是天一觀的道長(zhǎng)夺巩。 經(jīng)常有香客問我,道長(zhǎng)周崭,這世上最難降的妖魔是什么劲够? 我笑而不...
    開封第一講書人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮休傍,結(jié)果婚禮上征绎,老公的妹妹穿的比我還像新娘。我一直安慰自己磨取,他們只是感情好人柿,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著忙厌,像睡著了一般凫岖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逢净,一...
    開封第一講書人閱讀 52,337評(píng)論 1 310
  • 那天哥放,我揣著相機(jī)與錄音歼指,去河邊找鬼。 笑死甥雕,一個(gè)胖子當(dāng)著我的面吹牛踩身,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播社露,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼挟阻,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了峭弟?” 一聲冷哼從身側(cè)響起附鸽,我...
    開封第一講書人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瞒瘸,沒想到半個(gè)月后坷备,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡情臭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年击你,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谎柄。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖惯雳,靈堂內(nèi)的尸體忽然破棺而出朝巫,到底是詐尸還是另有隱情,我是刑警寧澤石景,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布劈猿,位于F島的核電站,受9級(jí)特大地震影響潮孽,放射性物質(zhì)發(fā)生泄漏揪荣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一往史、第九天 我趴在偏房一處隱蔽的房頂上張望仗颈。 院中可真熱鬧,春花似錦椎例、人聲如沸挨决。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)脖祈。三九已至,卻和暖如春刷晋,著一層夾襖步出監(jiān)牢的瞬間盖高,已是汗流浹背慎陵。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留喻奥,地道東北人席纽。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像映凳,于是被迫代替她去往敵國(guó)和親胆筒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容