RxAndroidコンビネーションRetrofitによるファイルアップロードpost getの実現
18584 ワード
RxAndroidコンビネーションRetrofitによるファイルアップロードpost getの実現
, !RxAndroid Retrofit Android , ,
RxAndroid Retrofit , ?
2.Retrofitの簡単な紹介
Retrofit Square Android ,Retrofit2 OkHttp ,OkHttp Google 。
retrofitのgithubアドレス
3.RxAndroid+Retrofit(ネットワークアクセス+ファイルアップロード)
compile 'io.reactivex:rxandroid:1.2.1'
compile 'io.reactivex:rxjava:1.2.4'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.alibaba:fastjson:1.1.55.android'
compile 'com.squareup.retrofit2:converter-scalars:2.0.0-beta4'
//
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
//retrofit2 rxjava
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
1.OkHttpClientの初期化
OkHttp , 。
private OkHttpClient getBaseOKhttpClient() {
OkHttpClient.Builder builder = new OkHttpClient().newBuilder()
.connectTimeout(20, TimeUnit.SECONDS)//
.readTimeout(2000, TimeUnit.MILLISECONDS)//
.writeTimeout(2000, TimeUnit.MILLISECONDS);//
int cacheSize = 10 * 1024 * 1024; // 10 MiB// ,
Cache cache = new Cache(BaseApplication.getInstance().getExternalCacheDir(), cacheSize);
builder.cache(cache);//
builder.retryOnConnectionFailure(true);// 。
builder.addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY));//
OkHttpClient mOkHttpClient = builder.build();//
return mOkHttpClient;
2.Retrofitのエンティティ
Retrofit ,
private Retrofit getRetrofitInstance() {
if (retrofit == null)
// Retrofit
builder = new Retrofit.Builder();
retrofit = builder
.baseUrl(BASE_URL)// , , .
// retrofit rxjava
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
// String
// , gson compile //'com.squareup.retrofit2:converter-gson:2.1.0'
//addConverterFactory(GsonConverterFactory.create())
.addConverterFactory(ScalarsConverterFactory.create())
.client(getBaseOKhttpClient()) // okhttp
.build();
return retrofit;
}
3.retrofitの要求タイプ:
, POST GET Multipart( )
interface HttpService {
// @FieldMap parameters can only be used with form encoding. (parameter #2)
@FormUrlEncoded
@POST
Observable<String> POST(@Url String url, @FieldMap Map<String, Object> parms);
@GET
Observable<String> GET(@Url String url, @QueryMap Map<String, Object> map);
@Multipart
@POST
Observable<String> UploadMultFile(@Url String ulr, @PartMap Map<String, ProgressRequestBody> parms);
}
4.ネットワーク要求の実行
/**
*
*
* @param url
* @param parms
* @param subscriber
*/
protected void startEnqueue(String url, Map parms, final Subscriber subscriber) {
switch (callType) {
case GET:
request = ServiceType().GET(url, parms);
break;
case POST:
request = ServiceType().POST(url, parms);
break;
case UPloadMultFile:
Map requestBodys = new HashMap();
Boolean hasFalse = false;
if (null != parms) {
int i = 0;
for (Map.Entry entry : parms.entrySet()) {
File file = new File(entry.getValue() + "");
if (file.exists()) {
//requestBodys.put("file" + i + "\"; filename=\"" + file.getName(), RequestBody.create(MediaType.parse("image/png"), file));
logError(Uploadlistener + "");
ProgressRequestBody fileBody = new ProgressRequestBody(file, Uploadlistener);
requestBodys.put("file" + i + "\"; filename=\"" + file.getName(), fileBody);
i++;
} else {
hasFalse = true;
}
}
}
if (hasFalse) logError(" , !");
request = ServiceType().UploadMultFile(url, requestBodys);
break;
}
// httpcallback.setRetryParms(url, request, parms, callType);
subscriion = request.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(result -> {
//
Dto dto = JSON.parseObject(result.toString(), Dto.class);
if (!subscriber.isUnsubscribed())
subscriber.onNext(dto);
},
e -> {
//
subscriber.onError(e);
},
() -> {
//
subscriion.unsubscribe();//
subscriber.onCompleted();
}
);
}
5.要求方法の簡単なパッケージ
/**
* post
*
* @param url
* @param parms
* @param subscriber
*/
public void Post(@NonNull String url, @Nullable Map parms, @Nullable final Subscriber subscriber) {
parms = Readey(parms, subscriber);
callType = CallType.POST;
startEnqueue(url, parms, subscriber);
}
6.基本apiのカプセル化、いくつかの基本情報の追加といくつかの共通の方法の呼び出しを便利にする
abstract class BaseApi {
// static {
// System.loadLibrary("gongpan");
// }
protected static final String getUrl(String actition) {
return actition + "?";
}
protected static final Map getMap() {
Map maps = new HashMap();
/**
* temp: 【app time ieme native 】
ieme:
time: 【 :new Date().getTime()+""】
*/
return maps;
}
//xRetrofit Retrofit okhttp ,
/****
*
*/
public static xRetrofit init() {
if (null == instance)
synchronized (xRetrofit.class) {
if (null == instance)
instance = new xRetrofit();
}
return instance;
}
protected static void post(String url, Map maps, Subscriber subscriber) {
xRetrofit xretrofit = xRetrofit.init();// xRetrofit
xretrofit.Post(url, maps, subscriber);// xRetrofit post
}
protected static void get(String url, Map maps, Subscriber subscriber) {
xRetrofit xretrofit = xRetrofit.init();
xretrofit.GET(url, maps, subscriber);// xRetrofit GET
}
protected static void UploadMultFile(String url, Map maps, ProgressRequestBody.UploadCallbacks Uploadlistener, Subscriber subscriber) {
xRetrofit xretrofit = xRetrofit.init();
xretrofit.UploadMultFile(url, maps, Uploadlistener, subscriber);
// xRetrofit UploadMultFile
}
}
7.apiのclass書き方:統一的に書くので、呼び出しが便利で、コードも間接的にbaseapiを継承します:
//
public class HomeApi extends BaseApi {
public static void getTopic_list(Subscriber subscriber) {
String url = getUrl("joke/content/list.from");
Map maps = getMap();
maps.put("sort", "desc");
maps.put("pagesize", "20");
maps.put("time", "1418816972");
maps.put("key", "df2e47d904c41e62071247bd7399da23");
post(url, maps, subscriber);// post
}
//
//Uploadlistener
public static void FileUpload(List paths, ProgressRequestBody.UploadCallbacks Uploadlistener, Subscriber subscriber) { String url = getUrlAppend(“app/AppFileUpload”); Map
}
8.Subscriberを簡単にカプセル化し、返信情報を統一的に処理するのに便利(エラー処理、ネット弾窓など)
public abstract class BaseSubscriber extends Subscriber<Dto> {
@Override
public void onCompleted() {
logError(" ");
}
@Override
public void onError(Throwable t) {
if (t.toString().contains("SocketTimeoutException")) {
logError(" , , ?");
return;
}
if (t.toString().contains("ConnectException")) {
logError(" , , ?");
return;
}
}
@Override
public void onNext(Dto dto) {
}
public static void logError(Object obj) {
Log.e("Xiang", obj.toString());
}
}
9.ページイベントにおけるapiの呼び出し、ネットワーク要求の実行
//
HomeApi.getTopic_list(new BaseSubscriber() {
@Override
public void onNext(Dto dto) {
super.onNext(dto);
}
});
はい、まずここまで書いて、暇な時間は絶えず改善します.何かバグがあったら、先輩の指摘を歓迎します.ありがとうございます.
プロジェクトdemoのgithubアドレス