Android上傳多張圖片的實例代碼(RxJava異步分發(fā))
學(xué)習(xí)RxJava有一段時間了,一直在考慮怎么使用,如何在項目中合理運用它。在android很多項目中,都會存在圖片上傳,下面我介紹如何用Rxjava異步上傳多張圖片。
一,用到的框架
compile 'top.zibin:Luban:1.0.9'//圖片壓縮 compile 'org.xutils:xutils:3.3.34'//網(wǎng)絡(luò)請求 compile 'io.reactivex:rxandroid:1.1.0'//rxandroid compile 'io.reactivex:rxjava:1.1.0'//rxjava
另外Rxjava與Lambda表達(dá)式非常契合,便引入了Lambda的配置,在gradle中需要支持java8的特性:
jackOptions {
enabled true
}
compileOptions {
targetCompatibility JavaVersion.VERSION_1_8
sourceCompatibility JavaVersion.VERSION_1_8
}
初始化配置,在自己的Application的onCreate中需要初始化網(wǎng)絡(luò)請求框架,否定會無法進(jìn)行網(wǎng)絡(luò)請求。
public class APP extends Application {
private static APP instance;
public static synchronized APP getInstance() {
return instance;
}
@Override
public void onCreate() {
super.onCreate();
x.Ext.init(this);
x.Ext.setDebug(org.xutils.BuildConfig.DEBUG);
instance = this;
}
}
二,圖片壓縮與上傳
這里為了演示用法與圖片上傳只是模擬請求所以手動創(chuàng)建了三個數(shù)組用來緩存圖片選擇后和處理后的url。
private List<String> mImageList;
private List<String> mReduceImageList;
private List<String> mImageUrl;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImageUrl = new ArrayList<>();
mImageList = new ArrayList<>();
mReduceImageList = new ArrayList<>();
mImageList.add("content://media/external/images/media/573778");
mImageList.add("content://media/external/images/media/573778");
mImageList.add("content://media/external/images/media/573778");
Button button = (Button) findViewById(R.id.button1);
button.setOnClickListener(v -> setImage());
}
圖片上傳大部分是根據(jù)拍照或者圖庫選擇的多張Uri地址,如果不進(jìn)行壓縮,圖片都是很大的,一般拍照的圖片都有幾百KB或者幾M,所以為了節(jié)省流量與服務(wù)器的承載負(fù)擔(dān),需要進(jìn)行壓縮。壓縮后的圖片大小僅在幾十KB左右。
/**
* 根據(jù)uri查詢位置圖片
*
* @param selectedImage
*/
private void sendPicByUri(Uri selectedImage) {
Cursor cursor = getContentResolver().query(selectedImage, null, null,
null, null);
String st8 = "沒有找到圖片";
if (cursor != null) {
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex("_data");
String picturePath = cursor.getString(columnIndex);
cursor.close();
if (picturePath == null || picturePath.equals("null")) {
Toast toast = Toast.makeText(this, st8, Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
return;
}
sendPicture(picturePath);
} else {
File file = new File(selectedImage.getPath());
if (!file.exists()) {
Toast toast = Toast.makeText(this, st8, Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
return;
}
sendPicture(file.getAbsolutePath());
}
}
/**
* 壓縮圖片
*
* @param filePath
*/
private void sendPicture(final String filePath) {
Log.i(tag, "壓縮圖片");
Luban
.get(this)
.load(new File(filePath))
.putGear(Luban.THIRD_GEAR)
.setCompressListener(new OnCompressListener() {
@Override
public void onStart() {
}
@Override
public void onSuccess(File file) {
Log.i(tag, "壓縮后的圖片==》");
uploadImg(file);
}
@Override
public void onError(Throwable e) {
}
})
.launch();
setResult(RESULT_OK);
}
為了優(yōu)化代碼和這些耗時操作用到的RxJava,進(jìn)行異步處理,我們需要創(chuàng)建RxJava的寫法:
/**
* 分發(fā)url 接收者
*/
private Func1<List<String>, Observable<String>> mOneLetterFunc = Observable::from;
private Action1<String> mImageUrlAction = s -> uploadImg(new File(s));
private Action1<String> mAddContent = s -> sendPicByUri(Uri.parse(s));
/**
* 分發(fā)壓縮圖片
*/
private void setImage() {
Log.i(tag, "開始分發(fā)獲取的url");
Observable.just(mImageList)
.subscribeOn(Schedulers.io()) // 指定 subscribe() 發(fā)生在 IO 線程
.observeOn(AndroidSchedulers.mainThread())
.flatMap(mOneLetterFunc)
.subscribe(mAddContent);
}
分發(fā)的同事會進(jìn)行異步網(wǎng)絡(luò)請求,進(jìn)行上傳圖片至服務(wù)器,并返回服務(wù)器所存儲的url圖片地址:
/**
* 圖片上傳服務(wù)器
*
* @param file 文件
*/
public void uploadImg(File file) {
Log.i(tag, "網(wǎng)絡(luò)請求上傳圖片");
RequestParams params = new RequestParams("這里是上傳到服務(wù)器的Http地址");
params.addBodyParameter("imgContent", file);
params.setMultipart(true);
x.http().post(params, new Callback.ProgressCallback<String>() {
@Override
public void onWaiting() {
}
@Override
public void onStarted() {
}
@Override
public void onLoading(long total, long current, boolean isDownloading) {
}
@Override
public void onSuccess(String result) {
try {
JSONObject jsonObject = new JSONObject(result);
JSONObject data = jsonObject.getJSONObject("data");
mImageUrl.add(data.getString("src"));
if (mImageList.size() == mImageUrl.size()) {
Log.i("上傳完成==", mImageUrl.toString());
}
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
Log.i("上傳出錯==", ex.getMessage());
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
});
}
為了節(jié)約時間,也可以在添加圖片時就進(jìn)行壓縮圖片等操作。上傳時,只進(jìn)行上傳的網(wǎng)絡(luò)操作
/**
* 直接上傳所選圖片圖片
*/
private void uploadingImage() {
Log.i(tag, "開始上傳圖片");
if (mReduceImageList.size() > 0) {
Observable.just(mReduceImageList)
.subscribeOn(Schedulers.io()) // 指定 subscribe() 發(fā)生在 IO 線程
.observeOn(AndroidSchedulers.mainThread())
.flatMap(mOneLetterFunc)
.subscribe(mImageUrlAction);
}
}
三,小結(jié)
這里只是簡單的演示Rxjava的基本用法,其強大毋庸置疑,但要運用好,還需要深入去學(xué)習(xí)它。它也讓我們的代碼更簡潔。學(xué)習(xí)永無止境,感謝大佬們給我們提供的那么多好用的框架。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android編程實現(xiàn)異步消息處理機制的幾種方法總結(jié)
- Android異步方法以同步方式實現(xiàn)
- Android使用OkHttp進(jìn)行網(wǎng)絡(luò)同步異步操作
- Android圖片異步加載框架Android-Universal-Image-Loader
- Android 異步任務(wù) 設(shè)置 超時使用handler更新通知功能
- Android開發(fā)實現(xiàn)ListView異步加載數(shù)據(jù)的方法詳解
- Android開發(fā)之HttpClient異步請求數(shù)據(jù)的方法詳解【附demo源碼下載】
- Android異步消息處理機制實現(xiàn)原理詳解
相關(guān)文章
Android版微信跳一跳小游戲利用技術(shù)手段達(dá)到高分的操作方法
朋友圈到處都是曬微信跳一跳小游戲的,很多朋友能達(dá)到二三百分了。下面小編給大家分享Android版微信跳一跳小游戲利用技術(shù)手段達(dá)到高分的操作方法,需要的朋友一起看看吧2018-01-01
android游戲載入的activity跳轉(zhuǎn)到游戲主菜單的activity具體實現(xiàn)
停止2s后由游戲載入頁面再跳轉(zhuǎn)到游戲菜單頁面,具體實現(xiàn)代碼如下,感興趣的朋友可以參考下哈2013-06-06
Android中TelephonyManager類的用法案例詳解
這篇文章主要介紹了Android中TelephonyManager類的用法,以獲取Android手機硬件信息為例詳細(xì)分析了TelephonyManager類的使用技巧,需要的朋友可以參考下2015-09-09
Android貝塞爾曲線初步學(xué)習(xí)第二課 仿QQ未讀消息氣泡拖拽黏連效果
這篇文章主要為大家詳細(xì)介紹了Android貝塞爾曲線初步學(xué)習(xí)的第二課,仿QQ未讀消息氣泡拖拽黏連效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03
Android6.0來電號碼與電話薄聯(lián)系人進(jìn)行匹配
這篇文章主要為大家詳細(xì)介紹了Android6.0來電號碼與電話薄聯(lián)系人進(jìn)行匹配的方法,感興趣的小伙伴們可以參考一下2016-07-07
Android 獲取正在運行的任務(wù)和服務(wù)的小例子
Android 獲取正在運行的任務(wù)和服務(wù)的小例子,需要的朋友可以參考一下2013-05-05

