安卓rxJava與retrofit配置示例
阿新 • • 發佈:2019-02-18
結合當前比較火的mvp開發模式,在AndroidStudio上使用rxJava與retrofit。
rxJava(非同步),retrofit(網路請求)
1.gradle新增依賴
2.http部分 RetrofitUtilscompile 'com.google.code.gson:gson:2.4' compile 'io.reactivex:rxandroid:1.2.1' compile 'com.squareup.retrofit2:retrofit:2.1.0' compile 'com.squareup.retrofit2:converter-gson:2.1.0' compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0' compile 'com.squareup.okhttp3:logging-interceptor:3.2.0'
public class RetrofitUtils { private static Retrofit mRetrofit; private static APIService mApiService; public static Retrofit newInstence() { if(mRetrofit == null) { OkHttpClient client = new OkHttpClient.Builder().connectTimeout(Ini._HTTP_CONNECT_TIMEOUT, TimeUnit.MILLISECONDS) .readTimeout(Ini._HTTP_READ_TIMEOUT, TimeUnit.MILLISECONDS).build(); mRetrofit = new Retrofit.Builder() .client(client)//新增一個client,不然retrofit會自己預設新增一個 .baseUrl("http://www.blog.com/pages/") .addConverterFactory(new StringConverterFactory()) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); } return mRetrofit; } public static APIService getApiService(){ newInstence(); if(mApiService == null) { mApiService = mRetrofit.create(APIService.class); } return mApiService; } static class FileRequestBodyConverterFactory extends Converter.Factory { @Override public Converter<File, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) { return new FileRequestBodyConverter(); } } static class FileRequestBodyConverter implements Converter<File, RequestBody> { @Override public RequestBody convert(File file) throws IOException { return RequestBody.create(MediaType.parse("image/*"), file); } } public static class StringConverterFactory extends Converter.Factory { public static StringConverterFactory create() { return new StringConverterFactory(); } private StringConverterFactory() { } @Override public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) { if(String.class.equals(type)) return new StringResponseBodyConverter(); else return null; } @Override public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) { if(String.class.equals(type)) return new StringRequestBodyConverter(); else return null; } } public static class StringResponseBodyConverter implements Converter<ResponseBody, String> { @Override public String convert(ResponseBody value) throws IOException { try { return value.string(); } finally { value.close(); } } } public static class StringRequestBodyConverter implements Converter<String, RequestBody> { private static final MediaType MEDIA_TYPE = MediaType.parse("application/json; charset=UTF-8"); private static final Charset UTF_8 = Charset.forName("UTF-8"); StringRequestBodyConverter() { } @Override public RequestBody convert(String value) throws IOException { Buffer buffer = new Buffer(); Writer writer = new OutputStreamWriter(buffer.outputStream(), UTF_8); writer.write(value); writer.close(); return RequestBody.create(MEDIA_TYPE, buffer.readByteString()); } } }
3.APIService
public interface APIService {
@GET
Observable<String> loginData(@Url String url);
}
4.這裡用一個登入介面作為例子(1)model
(2)presenterpublic class UserLoginModel { public void startLoginData(String url, Subscriber subscriber){ APIService apiService = RetrofitUtils.getApiService(); apiService.loginData(url).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) .subscribe(subscriber); } }
public class UserLoginPresenter {
private static final String TAG="UserLoginPresenter";
private WeakReference<IMainView> iMainView;
private UserLoginModel userLoginModel;
private Context context;
public UserLoginPresenter(Context context,IMainView iMainView) {
this.iMainView =new WeakReference<> (iMainView);
this.context=context;
userLoginModel=new UserLoginModel();
}
public void startLogin(final String userName, String userPaw){
/** 雲端驗證 **/
// 請求命令 登入
String act = "loginByEmployee";
// 生成sign
Map<String, Object> map = new HashMap<>();
map.put("user",userName);
map.put("password", MD5.md5(userPaw));
map.put("merchantid", userName); // 第一次登入用手機號做企業ID,不是第一次用真正的企業ID
map.put("storeid", "");
map.put("flag", 1);
map.put("appversion", "57_v2.7");
map.put("appos", Ini._APP_OS);
map.put("platform", Ini._VERSION_BUSINESS);
map.put("oper", userName);
map.put("deviceid", "");
map.put("devicetoken", "");
LogUtils.logE(TAG,"map--"+map.toString());
String strSign = getSign(act, map);
String strUrl = getHttpGetUrl(act,
Ini._API_SERVER_CHAIN, getP(map), strSign);
LogUtils.logE(TAG, "strUrl--" + strUrl);
userLoginModel.startLoginData(strUrl, new Subscriber<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
iMainView.get().onGetInfoError(e.getMessage());
}
@Override
public void onNext(String mesg) {
Gson gson = new Gson();
Type type = new TypeToken<LoginDataBean>() {}.getType();
LoginDataBean jsonBean = gson.fromJson(mesg, type);
LogUtils.logE(TAG, "jsonBean--" + jsonBean.getState());
if (jsonBean.getState()== Ini.STATE_SUCCESS){
Gson gsons = new Gson();
Type types = new TypeToken<LoginDataResult>() {}.getType();
LoginDataResult jsonBeans = gsons.fromJson(jsonBean.getMesg(), types);
savePerson(userName,jsonBeans);
iMainView.get().onGetInfoSuccess("登入成功");
}else {
iMainView.get().onGetInfoFail(jsonBean.getMesg());
}
}
});
}
public static String getSign(String act, Map<String, Object> map) {
String p = getSignP(map);
String urlQuery = "act=" + act + "&p=" + p + "&key=" + Ini._KEY_SIGN;
return MD5.md5(urlQuery);
}
public static String getHttpGetUrl(String act, String url, String p,
String sign) {
return url + "?act=" + act + "&p=" + p + "&sign=" + sign + "&r="
+ Math.random();
}
public static String getP(Map<String, Object> map) {
return Uri.encode(getSignP(map), "utf-8");
}
public static String getSignP(Map<String, Object> map) {
String p = "";
Set<String> set = map.keySet();
for (String i : set) {
if (p.length() > 0)
p += ",";
p += "\"" + i + "\":";
if (map.get(i) instanceof Integer) {
p += Integer.valueOf("" + map.get(i));
} else {
p += ("\"" + String.valueOf(map.get(i)) + "\"");
}
}
p = "{" + p + "}";
return p;
}
private void savePerson(String userName,LoginDataResult loginDataResult){
DataBaseHelper dataBaseHelper=DataBaseManager.getInstance(context);
SQLiteDatabase db=dataBaseHelper.getWritableDatabase();
ContentValues person =new ContentValues();
person.put("username",userName);
person.put("password",loginDataResult.getPassword());
db.insert(DataBaseHelper.TABLE_NAME,null,person);
db.close();
}
}
(3)IMainViewpublic interface IMainView {
void onGetInfoSuccess(String mesg);
void onGetInfoFail(String mesg);
void onGetInfoError(String errorMesg);
}
4.在登入處初始化userLoginPresenter = new UserLoginPresenter(context,this);
userLoginPresenter.startLogin(userName.getText().toString(), userPaw.getText().toString());