RxJava + Retrofit2 基本使用實例詳解(附源碼 效果圖)

  • 效果圖:控制檯輸出
    在這裏插入圖片描述
    源碼https://github.com/StephaineWYT/Translation

  • 步驟一
    Android Studio 新建 Empty Activity項目,在 build.gradle(Module:app)導入依賴設置編譯版本
    在這裏插入圖片描述

        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }
    
        implementation 'io.reactivex.rxjava2:rxjava:2.2.0'
        implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
        implementation 'com.squareup.retrofit2:retrofit:2.8.1'
        implementation 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
        implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
    
  • 步驟二
    項目的 res 目錄新建 xml 文件夾,並新建 network_security_config.xml
    在這裏插入圖片描述

    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <base-config cleartextTrafficPermitted="true" />
    </network-security-config>
    

    AndroidManifext.xml 兩個地方設置權限在這裏插入圖片描述

  • 步驟三 File – Settings – Plugins – 右側 MarketPlace 搜索安裝 GsonFormat 插件
    如果你網絡不太順暢,先訪問網址自己下載:官網GsonFormat插件下載
    下載好 Jar 包之後 在原來Android Studio 的 Plugins頁面上選擇 Install Plugins From Disk , 再選擇你下載好的jar包即可

    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述

  • 步驟四:項目結構,較簡單,下面逐一介紹各個文件
    在這裏插入圖片描述
    Transalation.java
    ① 先訪問項目用到的翻譯 api 它返回了翻譯的JSON字符串在這裏插入圖片描述

    {"status":1,"content":{"from":"zh","to":"en","out":"simple","vendor":"ciba","err_no":0}}
    
    // 參數說明:
    // a:固定值 fy
    // f:原文內容類型,日語取 ja,中文取 zh,英語取 en,韓語取 ko,德語取 de,西班牙語取 es,法語取 fr,自動則取 auto
    // t:譯文內容類型,日語取 ja,中文取 zh,英語取 en,韓語取 ko,德語取 de,西班牙語取 es,法語取 fr,自動則取 auto
    // w:查詢內容
    

    ② 新建Translation.java,在 Translation.java 同時按 Alt + S 鍵,並將上文中提到的json字符串複製進去,生成實體類及屬性,並添加 toString() 方法用於打印
    在這裏插入圖片描述

    package wen.translation;
    
    import androidx.annotation.NonNull;
    
    public class Translation {
        /**
         * sample url : http://fy.iciba.com/ajax.php?a=fy&f=zh&t=en&w=%E7%AE%80%E5%8D%95
         * status : 1
         * content : {"from":"zh","to":"en","out":"simple","vendor":"ciba","err_no":0}
         */
    
        private int status;
        private ContentBean content;
    
        public int getStatus() {
            return status;
        }
    
        public void setStatus(int status) {
            this.status = status;
        }
    
        public ContentBean getContent() {
            return content;
        }
    
        public void setContent(ContentBean content) {
            this.content = content;
        }
    
        public static class ContentBean {
            /**
             * from : zh
             * to : en
             * out : simple
             * vendor : ciba
             * err_no : 0
             */
    
            private String from;
            private String to;
            private String out;
            private String vendor;
            private int err_no;
    
            public String getFrom() {
                return from;
            }
    
            public void setFrom(String from) {
                this.from = from;
            }
    
            public String getTo() {
                return to;
            }
    
            public void setTo(String to) {
                this.to = to;
            }
    
            public String getOut() {
                return out;
            }
    
            public void setOut(String out) {
                this.out = out;
            }
    
            public String getVendor() {
                return vendor;
            }
    
            public void setVendor(String vendor) {
                this.vendor = vendor;
            }
    
            public int getErr_no() {
                return err_no;
            }
    
            public void setErr_no(int err_no) {
                this.err_no = err_no;
            }
    
            @NonNull
            @Override
            public String toString() {
                return "ContentBean{" +
                        "from='" + from + '\'' +
                        ", to='" + to + '\'' +
                        ", out='" + out + '\'' +
                        ", vendor='" + vendor + '\'' +
                        ", err_no=" + err_no +
                        '}';
            }
        }
    
        @NonNull
        @Override
        public String toString() {
            return "Translation{" +
                    "status=" + status +
                    ", content=" + content +
                    '}';
        }
    }
    
    

    ApiService.java 設置接口服務,這裏設置參數的 url 即可,訪問的 BaseUrl 在 MainActivity 中實現

    package wen.translation;
    
    import io.reactivex.Observable;
    import retrofit2.http.GET;
    import retrofit2.http.Query;
    
    public interface ApiService {
    
        @GET("ajax.php?a=fy&f=zh&t=en")
        Observable<Translation> getCall(@Query("w") String w);
    
    }
    
    

    MainActivity.java ,使用 RxJava 與 Retrofit2 進行解析

    package wen.translation;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Bundle;
    import android.util.Log;
    
    import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
    
    import io.reactivex.Observable;
    import io.reactivex.Observer;
    import io.reactivex.android.schedulers.AndroidSchedulers;
    import io.reactivex.disposables.Disposable;
    import io.reactivex.schedulers.Schedulers;
    import retrofit2.Retrofit;
    import retrofit2.converter.gson.GsonConverterFactory;
    
    public class MainActivity extends AppCompatActivity {
    
        private static final String TAG = "RxJava";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl("http://fy.iciba.com/")
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .build();
    
            ApiService apiService = retrofit.create(ApiService.class);
    
            Observable<Translation> observable = apiService.getCall("可靠");
    
            assert observable != null;
            observable.subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Observer<Translation>() {
                        @Override
                        public void onSubscribe(Disposable d) {
                            Log.d(TAG, "開始採用subscribe連接");
                        }
    
                        @Override
                        public void onNext(Translation translation) {
                            Log.i("===translation===", translation.toString());
                        }
    
                        @Override
                        public void onError(Throwable e) {
                            e.printStackTrace();
                            Log.d(TAG, "請求失敗");
                        }
    
                        @Override
                        public void onComplete() {
                            Log.d(TAG, "請求成功");
                        }
                    });
        }
    }
    
    

    效果如開頭所示,至此完成最基本的 RxJava + Retrofit2 使用
    感謝博主 https://blog.csdn.net/carson_ho/article/details/79125101

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章