RxAndroid之简单网络请求,数据操作

来源:互联网 发布:儿童摄影网络推广 编辑:程序博客网 时间:2024/04/28 08:22

查看项目请点击这里:项目地址

这里写图片描述
这里写图片描述
这里主要是数据操作和简单的网络请求。
先看一下数据操作吧,这里基本讲解都一样,我是按照官网的demo加上看的资料写的

package com.fanyafeng.rxandroid.activity;import android.content.Intent;import android.os.Bundle;import android.provider.Settings;import android.support.design.widget.FloatingActionButton;import android.support.design.widget.Snackbar;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.Toolbar;import android.view.View;import com.fanyafeng.rxandroid.BaseActivity;import com.fanyafeng.rxandroid.R;import rx.Observable;import rx.functions.Action1;public class RxAndroidActivity extends BaseActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_rx_android);        title = "测试rxandroid";        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);        fab.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)                        .setAction("Action", null).show();            }        });        initView();        initData();    }    private void initView() {    }    private void initData() {        hello("Fan", "Ya", "Feng");        hello("Beijing", "Chaoyang");    }    public static void hello(String... names) {        Observable.from(names).subscribe(new Action1<String>() {            @Override            public void call(String s) {                System.out.println("Hello " + s + "!");            }        });        for (int i = 0; i < names.length; i++) {            System.out.println(names[i]);        }        for (String s : names) {            System.out.println(s);        }        Observable.from(names).subscribe(s -> {            System.out.println("Hello " + s + "!");        });    }    @Override    public void onClick(View v) {        super.onClick(v);        switch (v.getId()) {            case R.id.btnToAndroid:                startActivity(new Intent(this, RxToActivity.class));                break;            case R.id.btnRxDeal:                startActivity(new Intent(this, RxDealDataActivity.class));                break;            case R.id.btnLambda:                startActivity(new Intent(this, LambdaActivity.class));                break;            case R.id.btnNetArgs:                startActivity(new Intent(this, NetArgsActivity.class));                break;        }    }}

主要方便的地方还是批处理,还有就是链式请求,很方便

package com.fanyafeng.rxandroid.activity;import android.os.Bundle;import android.support.design.widget.FloatingActionButton;import android.support.design.widget.Snackbar;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.Toolbar;import android.util.Log;import android.view.View;import android.widget.TextView;import android.widget.Toast;import com.fanyafeng.rxandroid.BaseActivity;import com.fanyafeng.rxandroid.R;import rx.Observable;import rx.Observer;import rx.Subscriber;import rx.android.schedulers.AndroidSchedulers;import rx.functions.Action1;import rx.schedulers.Schedulers;public class RxToActivity extends BaseActivity {    private TextView tvSubText;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_rx_to);        title = "RxAndroid跳转界面";        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);        fab.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)                        .setAction("Action", null).show();            }        });        initView();        initData();    }    private void initView() {        tvSubText = (TextView) findViewById(R.id.tvSubText);    }    private void initData() {    }    private void initData1() {        Observer<String> observer = new Observer<String>() {            @Override            public void onCompleted() {            }            @Override            public void onError(Throwable e) {            }            @Override            public void onNext(String s) {            }        };        Subscriber<String> subscriber = new Subscriber<String>() {            @Override            public void onCompleted() {            }            @Override            public void onError(Throwable e) {            }            @Override            public void onNext(String s) {            }        };        //注册观察活动        Observable<String> stringObservable = Observable.create(onSubscribe);        //分发订阅信息        stringObservable.observeOn(AndroidSchedulers.mainThread());        stringObservable.subscribe(textSubscriber);        stringObservable.subscribe(toastSubscriber);        hello("Fan", "Ya", "Feng");        hello("Beijing", "Chaoyang");        Observable observable = Observable.create(new Observable.OnSubscribe<String>() {            @Override            public void call(Subscriber<? super String> subscriber) {                subscriber.onStart();                //创建一个有序的list,onnext会依次调用                subscriber.onNext(hello("nihao"));                subscriber.onCompleted();            }        });    }    private void hello(String... names) {        Observable.from(names).subscribe(new Action1<String>() {            @Override            public void call(String s) {//                System.out.println("Hello " + s + "!");                String s1 = tvSubText.getText().toString().trim();                tvSubText.setText(s1 + s);            }        });    }    Observable.OnSubscribe onSubscribe = new Observable.OnSubscribe<String>() {        @Override        public void call(Subscriber<? super String> subscriber) {            subscriber.onNext(hello("World"));//发送事件            subscriber.onCompleted();//事件完成        }    };    Subscriber<String> toastSubscriber = new Subscriber<String>() {        @Override        public void onCompleted() {        }        @Override        public void onError(Throwable e) {        }        @Override        public void onNext(String s) {            Toast.makeText(RxToActivity.this, s, Toast.LENGTH_SHORT).show();        }    };    @Override    public void onClick(View v) {        super.onClick(v);        switch (v.getId()) {            case R.id.btnOperate1:                operate1();                break;            case R.id.btnOperate2:                operate2();                break;        }    }    private void operate2() {        Observable<String> stringObservable = Observable.just("Hello","World");        stringObservable.subscribe(new Action1<String>() {            @Override            public void call(String s) {                Log.d("rxto", s);                tvSubText.setText(s);            }        });    }    private void operate1() {        //注册观察活动        Observable<String> stringObservable = Observable.create(new Observable.OnSubscribe<String>() {            @Override            public void call(Subscriber<? super String> subscriber) {                subscriber.onNext(hello("Hello World"));//发送事件                subscriber.onCompleted();//事件完成            }        });//        stringObservable.observeOn(AndroidSchedulers.mainThread());//        stringObservable.observeOn(Schedulers.io());//        stringObservable.observeOn(Schedulers.computation());//        stringObservable.observeOn(Schedulers.newThread());        stringObservable.subscribe(textSubscriber);//有更新ui的默认主线程,不用去指定线程    }    private String hello(String names) {        Log.d("rxto", names);        return names;    }    //订阅者,接受字符串,修改控件    Subscriber<String> textSubscriber = new Subscriber<String>() {        @Override        public void onCompleted() {        }        @Override        public void onError(Throwable e) {        }        @Override        public void onNext(String s) {            tvSubText.setText(s);        }    };}

是不是感觉在更新一个ui的情况下很麻烦,命名一行就能解决的,可是麻烦好多,他这里提供了几个简单啊的封装方法

//更新ui控件    private Action1<String> textAction = new Action1<String>() {        @Override        public void call(String s) {            tvDealData.setText(tvDealData.getText().toString() + s);        }    };    private Action1<IpInfoBean> ipInfoBeanAction1 = new Action1<IpInfoBean>() {        @Override        public void call(IpInfoBean ipInfoBean) {            tvDealData1.setText(ipInfoBean.country);        }    };    private Action1<String> toastAction = new Action1<String>() {        @Override        public void call(String s) {            Toast.makeText(RxDealDataActivity.this, s, Toast.LENGTH_SHORT).show();        }    };    private Action1<IpInfoBean> ipInfoToastAction = ipInfoBean -> Toast.makeText(RxDealDataActivity.this, ipInfoBean.country, Toast.LENGTH_SHORT).show();    private Func1<List<String>, Observable<String>> oneLetterFunc = new Func1<List<String>, Observable<String>>() {        @Override        public Observable<String> call(List<String> strings) {            return Observable.from(strings);        }    };    private Func1<List<IpInfoBean>, Observable<IpInfoBean>> getIpInfoFunc = ipInfoBeen -> Observable.from(ipInfoBeen);    private Func1<List<IpInfoBean>, Observable<IpInfoBean>> ipInfoFunc = new Func1<List<IpInfoBean>, Observable<IpInfoBean>>() {        @Override        public Observable<IpInfoBean> call(List<IpInfoBean> ipInfoBeen) {            return Observable.from(ipInfoBeen);        }    };

可是尝试一下,基本上rxjava我感觉还是在批处理上有优势,再来看retrofit的网络请求处理
这里用的淘宝的请求ip接口

package com.fanyafeng.rxandroid.activity;import android.content.Intent;import android.os.Bundle;import android.support.design.widget.FloatingActionButton;import android.support.design.widget.Snackbar;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.Toolbar;import android.util.Log;import android.view.View;import android.widget.TextView;import com.fanyafeng.rxandroid.BaseActivity;import com.fanyafeng.rxandroid.R;import com.fanyafeng.rxandroid.netutil.Urls;import com.fanyafeng.rxandroid.retrofit.response.TaoBaoGetIpInfoResponse;import com.fanyafeng.rxandroid.retrofit.service.ApiService;import retrofit.Call;import retrofit.Callback;import retrofit.GsonConverterFactory;import retrofit.Response;import retrofit.Retrofit;public class RetrofitActivity extends BaseActivity {    private TextView tvShowInfo;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_retrofit);        title = "测试Retrofit";        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);        fab.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)                        .setAction("Action", null).show();            }        });        initView();        initData();    }    private void initView() {        tvShowInfo = (TextView) findViewById(R.id.tvShowInfo);    }    private void initData() {    }    @Override    public void onClick(View v) {        super.onClick(v);        switch (v.getId()) {            case R.id.btnSendRequest:                getData();                break;        }    }    private void getData() {        Retrofit retrofit = new Retrofit.Builder()                .addConverterFactory(GsonConverterFactory.create())                .baseUrl(Urls.URL_TAOBAO_BASET)                .build();        ApiService apiService = retrofit.create(ApiService.class);        Call<TaoBaoGetIpInfoResponse> getIpInfoResponseCall = apiService.getIpInfoBean("63.223.108.42");        getIpInfoResponseCall.enqueue(new Callback<TaoBaoGetIpInfoResponse>() {            @Override            public void onResponse(Response<TaoBaoGetIpInfoResponse> response, Retrofit retrofit) {                Log.d("main", response.body().data.toString());                TaoBaoGetIpInfoResponse getIpInfoResponse = response.body();                tvShowInfo.setText(getIpInfoResponse.data.country);            }            @Override            public void onFailure(Throwable t) {                tvShowInfo.setText(t.getMessage());            }        });    }}

怎么样是不是用的很顺畅,而且对处理结果封装的也很好
下面是api接口

package com.fanyafeng.rxandroid.retrofit.service;import com.fanyafeng.rxandroid.retrofit.response.TaoBaoGetIpInfoResponse;import retrofit.Call;import retrofit.http.GET;import retrofit.http.Query;import rx.Observable;/** * Created by 365rili on 16/6/16. */public interface ApiService {    @GET("/service/getIpInfo.php")    Call<TaoBaoGetIpInfoResponse> getIpInfoBean(@Query("ip") String ip);    //    下方测试    @GET("/token")    Observable<String> getToken();    @GET("/user")    Observable<TaoBaoGetIpInfoResponse> getIpinfoBean(@Query("token") String token, @Query("ip") String ip);}
0 0