-
效果圖:控制檯輸出
源碼: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
RxJava + Retrofit2 基本使用實例詳解(附源碼 效果圖)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.