查看项目请点击这里:项目地址
这里主要是数据操作和简单的网络请求。
先看一下数据操作吧,这里基本讲解都一样,我是按照官网的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);
}