王学岗Retrofit初探(四)——与Rxjava的使用

第一部分
RxJavaLoginService 接口

package com.tz.architect.retrofit.simple7.inter;

import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;
import rx.Observable;

import com.tz.architect.retrofit.simple5.model.UserBean;

public interface RxJavaLoginService {
	/**
	 *这里不能再用call了,要用Observable 
	 */
	@FormUrlEncoded
	@POST("LoginServlet")
	Observable<UserBean> login(@Field("username") String uname,
			@Field("password") String password);
	
}

SimpleRetrofitRxJava 类

package com.tz.architect.retrofit.simple7;

import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import rx.Observer;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;

import com.tz.architect.retrofit.simple1.SimpleSystemLogin.OnHttpResultListener;
import com.tz.architect.retrofit.simple5.model.UserBean;
import com.tz.architect.retrofit.simple7.inter.RxJavaLoginService;

public class SimpleRetrofitRxJava {
/**
 * 第一步:配置支持Rxjava环境
 */
	private static String URL_GETUSER = "http://192.168.2.1:8080/Dream_Architect_Retrofit_Server/";

	public static void login(String username, String password,
			final OnHttpResultListener onHttpResultListener) {
		Retrofit retrofit = new Retrofit.Builder().baseUrl(URL_GETUSER)
				//注意这里的添加
	//添加RxJava转换器			.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
	//添加Gson转换器			.addConverterFactory(GsonConverterFactory.create()).build();
		RxJavaLoginService loginService = retrofit
				.create(RxJavaLoginService.class);
       //返回值是:Observable<UserBean>
	//subscribeOn:指定发送的网络请求所在的线程
		//io线程:Schedulers.io()
		//回调所在的线程:AndroidSchedulers.mainThread()
		loginService.login(username, password).subscribeOn(Schedulers.io())
				.observeOn(AndroidSchedulers.mainThread())
				.subscribe(new Observer<UserBean>() {

					@Override
					public void onCompleted() {

					}

					@Override
					public void onError(Throwable e) {

					}

					@Override
					public void onNext(UserBean t) {
						onHttpResultListener.onHttpResult(t.toString());
					}
				});
	}

}

main类

package com.tz.architect.retrofit;

import android.app.Activity;
import android.os.Bundle;

import com.tz.architect.retrofit.simple1.SimpleSystemLogin;
import com.tz.architect.retrofit.simple1.SimpleSystemLogin.OnHttpResultListener;
import com.tz.architect.retrofit.simple2.SimpleOkHttpLogin;
import com.tz.architect.retrofit.simple3.SimpleRetrofitLogin;
import com.tz.architect.retrofit.simple4.SimpleRetrofitUploadImage;
import com.tz.architect.retrofit.simple5.SimpleRetrofitGson;
import com.tz.architect.retrofit.simple6.SimpleRetrofitXml;
import com.tz.architect.retrofit.simple7.SimpleRetrofitRxJava;
import com.tz.architect.retrofit.simple8.MyRetrofitTest;
import com.tz.architect.retrofit.utils.FileManager;
import com.tz.architect.retrofit.utils.ToastUtil;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		// simpleSystemLogin();
		// simpleOkHttpLogin();
		// simpleRetrofitLoginSync();
		// simpleRetrofitLoginAsync();
		// simpleRetrofitLoginGetAsync();
		// simpleRetrofitLoginGetQueryMap();
		// simpleRetrofitUploadImage();
		// simpleRetrofitLoginGson();
		// simpleRetrofitConvertXml();
		// simpleRetrofitRxJava();
		simpleMyRetrofitTest();
	}

	private OnHttpResultListener onHttpResultListener = new OnHttpResultListener() {

		@Override
		public void onHttpResult(Object result) {
			if (result == null) {
				ToastUtil.showToast(MainActivity.this, "登录失败!");
			} else {
				ToastUtil.showToast(MainActivity.this, result.toString());
			}
		}
	};

	private void simpleSystemLogin() {
		SimpleSystemLogin.login("Hello", "123", onHttpResultListener);
	}

	private void simpleOkHttpLogin() {
		SimpleOkHttpLogin.loginSync("Hello", "123", onHttpResultListener);
	}

	private void simpleRetrofitLoginSync() {
		SimpleRetrofitLogin.loginSync("Hello", "123", onHttpResultListener);
	}

	private void simpleRetrofitLoginAsync() {
		SimpleRetrofitLogin.loginAsync("Hello", "123", onHttpResultListener);
	}

	// 发送get请求
	private void simpleRetrofitLoginGetAsync() {
		SimpleRetrofitLogin.loginGet("Hello", "123", onHttpResultListener);
	}

	private void simpleRetrofitLoginField() {
		SimpleRetrofitLogin
				.loginPostField("Hello", "123", onHttpResultListener);
	}

	private void simpleRetrofitLoginGetQueryMap() {
		SimpleRetrofitLogin.loginGetQueryMap("Hello", "123",
				onHttpResultListener);
	}

	// 上传图片
	private void simpleRetrofitUploadImage() {
		String imagePath = FileManager.getRecordFile().getAbsolutePath()
				+ "/paint.png";
		SimpleRetrofitUploadImage.uploadImage(imagePath, onHttpResultListener);
	}

	// 上传图片
	private void simpleRetrofitLoginGson() {
		SimpleRetrofitGson.loginGson("Hello", "123", onHttpResultListener);
	}

	private void simpleRetrofitConvertXml() {
		SimpleRetrofitXml.getUserList();
	}

	private void simpleRetrofitRxJava() {
		SimpleRetrofitRxJava.login("Hello", "123", onHttpResultListener);
	}

	private void simpleMyRetrofitTest() {
		MyRetrofitTest.login("Hello", "123", onHttpResultListener);
	}

}

一二三四需要下载的夹包这里写图片描述
第二部分
先看下接口,我们定义了两个方法,登陆与获取用户信息

public interface IService {
        @POST("login/json")
        Observable<BaseResult> loginWithRx(@Body UserParam parm);
        @GET("user/{id}")
        Observable<User> getUserInfoWithRx(@Path("id") int user_id);
}

我们现在有这个需求,首先实现登陆功能,然后获取用户的信息,我们当然可以这么写在这里插入图片描述
除此之外我们还可以使用flatmap操作符

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(testurl)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .build();
    final IService api = retrofit.create(IService.class);
    api.loginWithRx(new UserParam("wangdidi", "123456")).flatMap(new Function<BaseResult, ObservableSource<User>>() {

        @Override
        public ObservableSource<User> apply(BaseResult baseResult) throws Exception {
            return api.getUserInfoWithRx(baseResult.getUser_id());
        }
    }).subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Consumer<User>() {
                @Override
                public void accept(User user) throws Exception {
                    Toast.makeText(MainActivity.this, "username:" + user.getUserName(), Toast.LENGTH_LONG).show();
                }
            });
}

第三部分
我们先看下服务端的要求
在这里插入图片描述

看下接口信息

// 编辑团队信息
@POST(RunningGroupURL.POST_EDIT_GROUP_INFO)
Observable<PublicResponseEntity<Void>> postEditGroupInfo(@Body EditGroupInfoParams stepsGroupRequest, @QueryMap Map<String, String> params);

这是EditGroupInfoParams类

package com.taikang.app.runninggroup.params;

/**
 * Created by renzhijiang on 2018/9/30.
 */

public class EditGroupInfoParams {


    /**
     * groupName : string
     * words : string
     */

    private String groupName;
    private String words;

    public String getGroupName() {
        return groupName;
    }

    public void setGroupName(String groupName) {
        this.groupName = groupName;
    }

    public String getWords() {
        return words;
    }

    public void setWords(String words) {
        this.words = words;
    }
}

//  编辑团队信息
public Observable<PublicResponseEntity<Void>> postEditGroupInfo(EditGroupInfoParams editGroupInfoParams) {
//这个类里面包含userId和token
    HashMap<String, String> params = UserManager.getUserIdAngTokenParamsMap();
    return mServiceApi.postEditGroupInfo(editGroupInfoParams,params).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());
}

看下我们的调用

 EditGroupInfoParams params = new EditGroupInfoParams();
    params.setGroupName(groupName);
    params.setWords(groupSlogan);
    addDispose(runningGroupViewMoudle.postEditGroupInfo(params).subscribe(new Consumer<PublicResponseEntity<Void>>() {
        @Override
        public void accept(PublicResponseEntity<Void> data) throws Exception {
            if (null != data) {
                int code = data.getCode();
                if (code == 0) {
                    ToaUtils.show(mContext, "团队信息保存成功");
                    Intent intent = new Intent(mContext, QuarterChampionActivity.class);
                    startActivity(intent);
                    finish();
                } else if (code == -1) {
                    // 登录过期
                } else {
                    ToaUtils.show(mContext, "信息保存失败,请重试");
                }
            } else {
                ToaUtils.show(mContext,"网络走丢了,请检查网络");
            }
        }
    }, new Consumer<Throwable>() {
        @Override
        public void accept(Throwable throwable) throws Exception {
            ToaUtils.show(mContext,"网络走丢了,请检查网络");
        }
    }));
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值