如何在Android Okhttp框架以文件形式上傳圖片?網友“聽海”寫了這段代碼,昌暉儀表在此分享給大家。
以Post為例
public Observable<String> postImageview(final String url, final MultipartBody requestBody){
//創建被觀察者
Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>(){
@Override
public void call(Subscriber<? super String> subscriber) {
final Subscriber mSubscriber=subscriber;
//沒有取消訂閱的時候
if(!mSubscriber.isUnsubscribed()){
//構建post請求
Request request=null;
String cookie=CliniciansApplication.getOkhttpCookie();
if(!BooleanUtils.isEmpty(cookie)){
request=new Request.Builder()
.addHeader("cookie",cookie)
.url(url)
.post(requestBody)
.build();
}else{
request=new Request.Builder()
.url(url)
.post(requestBody)
.build();
}
if(mOkHttpClient!=null){
mOkHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
//通知訂閱者的錯誤信息
mSubscriber.onError(e);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if(null!=response){//response 不為空
if(response.isSuccessful()){//response 請求成功
//通知訂閱者的成功信息
mSubscriber.onNext(response.body().string());
}else{//response 請求失敗
//通知訂閱者的錯誤信息
IOException IOExceptionx=new IOException();
mSubscriber.onError(IOExceptionx);
}
}else{//response 為空
//通知訂閱者的錯誤信息
IOException IOExceptionx=new IOException();
mSubscriber.onError(IOExceptionx);
}
//通知完畢
mSubscriber.onCompleted();
}
});
}
}
}
});
return observable;
}
調用
private void uploadAva(final String posturl,final File file,final String path){
if((null!=mRxAndroidOkhttp)&&(null!=file)){
showProgressDialogs();
MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
builder.addFormDataPart("files", file.getName(), RequestBody.create(MediaType.parse("image/png"), file));
builder.addFormDataPart("sePath","avatar");
MultipartBody requestBody = builder.build();
//observable定義被觀察者
mObservable=mRxAndroidOkhttp.postImageview(posturl,requestBody);
if(null!=mObservable){
//定義觀察者
Subscriber<String> mSubscriber=new Subscriber<String>(){
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
dismissProgressDialogs();
toast.showToast(StringConstant.errorstate1);
}
@Override
public void onNext(String s) {
parseAva(s,path);
}
};
/**
* 訂閱者關聯被觀察者
* Schedulers.io()說明是輸入輸出的計劃任務
* AndroidSchedulers.mainThread()說明訂閱者是中ui主線程中執行
* */
mObservable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(mSubscriber);
}
}
}