當在拿一個 API 的資料時,但只用 Retrofit 資料量太大將會造成你的 app 不能動作,輕則卡住在那個 Loding 頁面,重則將會導致程是被強制停止,所以我們就要使用到 RxJava 來解決這個問題
到 API 拿資料時獲取他回傳的資料,並連結到創建資料格式的class(這裡將會有一些些許的差異)
@FormUrlEncoded
@POST("auth/login")
Observable<LoginTokenModel>//須將原本的call換成Observable
getLoginToken(@Field("account") String account, @Field("password") String password);
之後到了連結主程式的部分,這部分也會有一些差異
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private EditText account, password;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
button = findViewById(R.id.login);
account = findViewById(R.id.user);
password = findViewById(R.id.password);
button.setOnClickListener(this);
}
public void onClick(View view) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("...")
.addConverterFactory(GsonConverterFactory.create())
//设置使用Gson解析(记得加入依赖)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
// 支持RxJava(當 Retrofit2 需要使用RxJava時就需要添加)
.build();
ApiService request = retrofit.create(ApiService.class);
Observable<LoginTokenModel> observable = request.getLoginToken(account.getText().toString(),password.getText().toString());
//防呆
if (account.getText().toString().equals("") && password.getText().toString().equals("")) {
Toast.makeText(getApplicationContext(), "請輸入數值", Toast.LENGTH_SHORT).show();
}
else {
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new DisposableObserver<LoginTokenModel>() {
@Override
public void onNext(LoginTokenModel loginTokenModel) {
String token=loginTokenModel.getToken();
SharedPreferences sharedPreferences=
getSharedPreferences("data",Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("token", token);
editor.commit();
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
Intent intent=new Intent(MainActivity.this,Main.class);
startActivity(intent);
List<Integer> array = new ArrayList<Integer>();
}
});
}}
}
這樣就完成了