1. 程式人生 > >Retrofit2 學習總結 (二)Rxjava +Retrofit +java web伺服器簡單小例子

Retrofit2 學習總結 (二)Rxjava +Retrofit +java web伺服器簡單小例子

通過一段時間的學習,Rxjava Retrofit2終於算是入了門,學習的過程中寫了個簡單的小例子,像我這樣的人學習東西還是喜歡有一個正確的例子用來學習的。

本demo已經上傳到了gitHup:

java伺服器 :https://github.com/tanglonghui/Retrofit2Server

安卓客戶端:https://github.com/tanglonghui/Retrofit2Study

千山萬水總是情,給個star行不行

寫篇部落格總還是要有點東西的,就貼兩個程式碼地址有點虛,順便再鞏固一下自己所學。

總的來說,這是一篇面向菜鳥的文章,只有菜鳥才知道菜鳥需要什麼。

一、環境搭建

安卓:既然要用Rxjava Retrofit2 幾個包還是要有的

//retrofit2依賴
    compile 'com.squareup.retrofit2:retrofit:2.0.2'
    compile 'com.squareup.retrofit2:converter-gson:2.0.2'
    //rxjava2依賴
    compile 'io.reactivex.rxjava2:rxjava:2.1.1'
    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
    //聽說可以用來解決適配性問題
    compile'com.squareup.retrofit2:adapter-rxjava2:2.2.0'

伺服器:

用了三個jar包,前兩個是解決檔案上傳的,後一個大家都知道。

想學麼?想學的話就去百度吧,我也不會。

二、Retrofit2 網路請求

打字好累啊,沒有耐心與實力的人真可怕。

來大家跟我一起做。

1.搞一個網路請求介面 interface

public interface GetUserService {
    //0.簡單的get請求 通過get請求一個User 模仿token驗證
    @GET("UserServelt")
    Call<User> getUser(@Header("token") String token);
}

@get :表示get請求 

“Userservelt” :與下文的baseUrl組成一個完整的Url。

Call<User> : Retrofit2標準配置 <>中放你想要的資料格式。

@Header(“token”) :請求頭中帶一個token

2.搞一個Api

public class Api {
    private static String baseUrl="http://192.168.1.101:8080/Retrofit2Server/";
    /*
     * 同一獲得網路請求的介面
     * baserUrl 需按實際情況更改
     */
    public static GetUserService getUserService(){

        Retrofit retrofit=new Retrofit.Builder()
                .baseUrl(baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        GetUserService getUserService=retrofit.create(GetUserService.class);

        return getUserService;
    }
}

這個是不是叫封裝0。0,反正都是這麼做的

 

3.發起網路請求

   case R.id.button:
                Api.getUserService().getUser("1433227").enqueue(new Callback<User>() {
                    @Override
                    public void onResponse(Call<User> call, Response<User> response) {
                        Toast.makeText(MainActivity.this, "結果" + response.body(), Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onFailure(Call<User> call, Throwable t) {
                        Toast.makeText(MainActivity.this, "結果失敗", Toast.LENGTH_SHORT).show();
                    }
                });

                break;

這個是非同步請求。

三、Rxjava+Retrofit2網路請求

同樣

1.搞一個介面 interface

public interface RxjavaGetService {
    /*
    *  rxjava 用來替換Call的有兩個 Flowable 支援背壓  Observable 不支援背壓 但正常情況下 開銷低一些
     *  根據 選擇 使用 .subscribe(new Subscriber<User>(){}) 或 .subscribe(new Observer<User>(){}}
     */
    //0.簡單的get請求 通過get請求一個User 模仿token驗證
    @GET("UserServelt")
    Flowable<User> getUser(@Header("token") String token);//Flowable支援背壓
}

也沒變多少,就call<User> 換成 Rxjava 給你提空的東東

2.搞一個api

public class Api {
    private static String baseUrl="http://192.168.1.101:8080/Retrofit2Server/";
    /*
     * 同一獲得網路請求的介面
     * baserUrl 需按實際情況更改
     */
    public static GetUserService getUserService(){

        Retrofit retrofit=new Retrofit.Builder()
                .baseUrl(baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        GetUserService getUserService=retrofit.create(GetUserService.class);

        return getUserService;
    }
    public static RxjavaGetService RxjavaGetService (){
        Retrofit retrofit=new Retrofit.Builder()
                .baseUrl(baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//Rxjava適配
                .build();
        RxjavaGetService rxjavaGetService=retrofit.create(RxjavaGetService.class);

        return rxjavaGetService;
    }

}

你可以觀察一下,其實也沒多大差別,就是多了一層Rxjava適配

3.網路請求

case R.id.button:
                //正確返回依次走 124  錯誤直接進3
                Api.RxjavaGetService().getUser("1433223")
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(new Subscriber<User>() {
                            @Override
                            public void onSubscribe(Subscription s) {
                               /*
                               吃了英語的虧,大概,感覺是推薦我們用這個值吧
                               大概是設定背壓什麼的
                                */
                                s.request(Long.MAX_VALUE);
                                Toast.makeText(Main2Activity.this, "1", Toast.LENGTH_SHORT).show();
                            }

                            @Override
                            public void onNext(User user) {
                                //在這裡進行返回訊息出來
                                Toast.makeText(Main2Activity.this, "2", Toast.LENGTH_SHORT).show();
                            }

                            @Override
                            public void onError(Throwable t) {
                                //錯誤走這裡
                                Toast.makeText(Main2Activity.this, "3", Toast.LENGTH_SHORT).show();
                            }

                            @Override
                            public void onComplete() {
                                Toast.makeText(Main2Activity.this, "4", Toast.LENGTH_SHORT).show();
                            }
                        });
                break;
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())

百度應該知道上面那兩個東西是幹什麼的

一個io的計劃,一個主執行緒執行啥的。。。。。

寫點什麼就覺得很累,才能不足吧,畢竟自己也才是瞭解介個是什麼,那個是什麼,真要解釋是什麼,腦子裡也沒有多少貨,

CV程式設計師,

努力不一定成功,但放棄絕對很輕鬆。

哈哈~~~~