Day23 Android - RxJava+Post

那麽今天主要要用RxJava来结合retrofit做Post的部分,与上次用Retrofit的call类似,但这次是要用Observe(被观察者)来做,json假资料:posts,那麽首先先加入依赖。

依赖

老样子,在gradle:app的dependcies加入依赖及retrofit需要用到的网路权限,今天要加入的比较多。

    implementation 'io.reactivex.rxjava2:rxjava:2.0.1'
    implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
    implementation'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
    implementation 'com.squareup.retrofit2:retrofit:2.1.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.1.0'

权限

将网路的权限加入至AndroidManifest.xml中。

 <uses-permission android:name="android.permission.INTERNET" />

接着我们就开始进行设计,首先一样宣告posts的Model,定义网站的四个data(userId、Id、Title、Body)然後+getter、setter,一样可由右键->generate->gsonformatplus新增(需先安装plugins):

public class Model {
    private Integer userId;
    private Integer id;
    private String title;
    private String body;
    public Model(Integer userId , Integer id , String title , String body){
        this.userId=userId;
        this.id=id;
        this.title=title;
        this.body=body;
    }

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getBody() {
        return body;
    }

    public void setBody(String body) {
        this.body = body;
    }
}

Model这边定义完资料後,那麽接着就看到接口Interface。

Interface

    //@POST("posts")
    //Call<Model> getCall(@Body Model data);
    @POST("posts")
    Observable<Response<Model>> getCall(@Body Model data);//宣告成Observable<Response<?>>,接收Response物件(回传的东西)

比较不一样的是之前是用Call来进行呼叫,而这次是要宣告成Observable(被观察者)然後从主程序使用Observer(观察者)将资料读出。

Manager

public class Manager {
    private static Manager mInstance = new Manager();

    private MyApiService myApiService;

    private Manager() {
        
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://jsonplaceholder.typicode.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//新增此行,rxjava创建Observable对象的调配器(红字的话要检查gradle有没有安装rxjava2-adapter的依赖)
                .build();

        myApiService = retrofit.create(MyApiService.class);
    }

    public static Manager getInstance() {
        return mInstance;
    }

    public MyApiService getAPI() {
        return myApiService;
    }
}

主程序

接着可能会简单的带到subscribeOn与observeOn这些线程操作。

public class MainActivity extends AppCompatActivity {
    Observable<Response<Model>> model;//被观察者object
    MyApiService myApiService;//api interface object
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Model data=new Model(10,20,"This is a title","This is a body");//新增的资料
        myApiService=Manager.getInstance().getAPI();
        model = myApiService.getCall(data);//使用getCall方法
        model.subscribeOn(Schedulers.io())//I/O模式,可指定Observer在特定的调度上观察Observable
            .observeOn(AndroidSchedulers.mainThread())//指定Observable在特定的调度上进行动作
            .subscribe(new Observer<Response<Model>>() {//订阅建立观察者
                @Override
                public void onSubscribe(Disposable d) {

                }

                @Override
                public void onNext(Response<Model> value) {
                    Log.d("Post",""+value.code());
                    Log.d("Post","userid:"+value.body().getUserId());
                    Log.d("Post","id:"+value.body().getId());
                    Log.d("Post","title:"+value.body().getTitle());
                    Log.d("Post","body:"+value.body().getBody());
                }

                @Override
                public void onError(Throwable e) {
                    Log.d("Post","Error");
                }

                @Override
                public void onComplete() {

                }
            });
    }
}

成果

https://ithelp.ithome.com.tw/upload/images/20210911/20139259ja5YTMMN0M.png


<<:  Epoch(时期)、Batch size(批次)、Iteration(迭代)、Learning rate

>>:  Day 26 - "不在办公室里"工作已快成为常态

html 下拉式选单

今天要介绍下拉式选单,写法非常简单,直接来看程序码范例 <select> <opt...

Dungeon Mizarka 022

Doc modification 今天又花了不少时间更新文件,主要是加入魔法的设定。为了要了解哪些魔...

Day 5. 关於.NET後端框架

以.NET Framework来说,网页技术必备要会的有WebForm,MVC,WebAPI三种技术...

D10 doc系统、首页

制作文件系统首页 先将使用者的个人资料页做好 回到docsystem_5 django-admin ...

JSDC 2020 回顾 - AMP 最佳实践

AMP & the missing parts Google doesn't tell 讲...