天天看点

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

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

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

这里主要是数据操作和简单的网络请求。

先看一下数据操作吧,这里基本讲解都一样,我是按照官网的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 = ; 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);
}
           

继续阅读