iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 14
0
Mobile Development

Android的30天學習歷程系列 第 14

#第14篇:RxJava 合併 Retrofit2

  • 分享至 

  • xImage
  •  

前言

當在拿一個 API 的資料時,但只用 Retrofit 資料量太大將會造成你的 app 不能動作,輕則卡住在那個 Loding 頁面,重則將會導致程是被強制停止,所以我們就要使用到 RxJava 來解決這個問題

操作

  1. 首先一樣創建一個class並將需接收的資料生成好
  2. 在主程式使用 retrofit 語法去 API 搜尋資料

到 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>();
                        }
                    });
        }}
    }

這樣就完成了


上一篇
#第13篇:RxJava 使用
下一篇
第15篇:手電筒的使用
系列文
Android的30天學習歷程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言