不得不承認(rèn)肮疗,用著Bmob提供的后端云的感覺倍兒爽,省了服務(wù)器不說柬讨,安卓端的代碼也簡化了不少崩瓤,聯(lián)網(wǎng)異步什么的都不用管了。不過踩官,今天在上傳圖片期間遇到一些坑却桶,查了文檔也沒找到個(gè)之乎所以然,在此做一下記錄蔗牡。權(quán)當(dāng)備忘颖系。
目的
我想做的是類似于朋友圈的那種,一個(gè)用戶發(fā)表一個(gè)動態(tài)辩越,動態(tài)里面包含若干文字以及若干圖片集晚。今天僅就這幾張圖片的上傳來說說。
官方說法
恩区匣。官方文檔的說法:
上傳一條多個(gè)文件的數(shù)據(jù)
往Music表中插入一條有兩個(gè)文件的數(shù)據(jù)的邏輯偷拔,首先進(jìn)行文件的同步上傳操作,示例代碼如下:
String[] filePaths = new String[2];
filePaths[0] = filePath_mp3;
filePaths[1] = filePath_lrc;
Bmob.uploadBatch(this, filePaths, new UploadBatchListener() {
@Override
public void onSuccess(List<BmobFile> files,List<String> urls) {
// TODO Auto-generated method stub
Log.i("life","insertDataWithMany -onSuccess :"+urls.size()+"-----"+files+"----"+urls);
if(urls.size()==2){//如果全部上傳完亏钩,則更新該條記錄
Song song =new Song("汪峰0","北京北京0",files.get(0),files.get(1));
insertObject(song);
}else{
//有可能上傳不完整莲绰,中間可能會存在未上傳成功的情況,你可以自行處理
}
}
@Override
public void onError(int statuscode, String errormsg) {
// TODO Auto-generated method stub
ShowToast("錯(cuò)誤碼"+statuscode +",錯(cuò)誤描述:"+errormsg);
}
@Override
public void onProgress(int curIndex, int curPercent, int total,
int totalPercent) {
// TODO Auto-generated method stub
Log.i("life","insertBatchDatasWithOne -onProgress :"+curIndex+"---"+curPercent+"---"+total+"----"+totalPercent);
}
});
上傳成功之后姑丑,再進(jìn)行數(shù)據(jù)的添加操作蛤签。示例代碼如下:
private void insertObject(final BmobObject obj){
obj.save(MainActivity.this, new SaveListener() {
@Override
public void onSuccess() {
// TODO Auto-generated method stub
ShowToast("-->創(chuàng)建數(shù)據(jù)成功:" + obj.getObjectId());
}
@Override
public void onFailure(int arg0, String arg1) {
// TODO Auto-generated method stub
ShowToast("-->創(chuàng)建數(shù)據(jù)失敗:" + arg0+",msg = "+arg1);
}
});
}
實(shí)際操作
恩栅哀,乍一看震肮,官方文檔介紹的清晰明了称龙,沒啥問題。那好吧戳晌。開擼吧鲫尊!結(jié)果……
方法過時(shí)
方法過時(shí)了?還報(bào)這么多錯(cuò)沦偎?好尷尬耙呦颉!
不過豪嚎,仔細(xì)看了下需要的參數(shù)搔驼,發(fā)現(xiàn)并不需要傳上下文,于是我把第一個(gè)參數(shù)刪除了侈询。雖然方法過時(shí)舌涨,但是還是可以用滴!
不過這也終究不是長久之計(jì)扔字,過時(shí)了泼菌,說不定什么時(shí)候就淘汰了。那應(yīng)該用哪個(gè)方法替代呢啦租?我翻遍了文檔,終于發(fā)現(xiàn)了這句話荒揣。
自BmobSDKv3.4.6開始,文件批量上傳的靜態(tài)方法由Bmob轉(zhuǎn)移至BmobFile類,建議調(diào)用BmobFile.uploadBatch方法篷角。
于是乎,終極解決方案:
成功系任,成功恳蹲,成功?
上傳了三張圖片俩滥,在成功的方法里打了個(gè)log嘉蕾,結(jié)果發(fā)現(xiàn)這個(gè)log打印了3遍。關(guān)于這個(gè)問題霜旧,恩错忱,官方文檔說的很清楚。
有多少個(gè)文件上傳成功挂据,onSuccess方法就會執(zhí)行多少次;
大家可以通過onSuccess回調(diào)方法中的files或urls集合的大小與要上傳的總文件個(gè)數(shù)比較以清,如果一樣,則表示全部文件上傳成功崎逃。
示例代碼如下:
String filePath_mp3 = "/mnt/sdcard/testbmob/test1.png";
String filePath_lrc = "/mnt/sdcard/testbmob/test2.png";
final String[] filePaths = new String[2];
filePaths[0] = filePath_mp3;
filePaths[1] = filePath_lrc;
BmobFile.uploadBatch(filePaths, new UploadBatchListener() {
@Override
public void onSuccess(List<BmobFile> files,List<String> urls) {
//1掷倔、files-上傳完成后的BmobFile集合,是為了方便大家對其上傳后的數(shù)據(jù)進(jìn)行操作个绍,例如你可以將該文件保存到表中
//2勒葱、urls-上傳文件的完整url地址
if(urls.size()==filePaths.length){//如果數(shù)量相等浪汪,則代表文件全部上傳完成
//do something
}
}
@Override
public void onError(int statuscode, String errormsg) {
ShowToast("錯(cuò)誤碼"+statuscode +",錯(cuò)誤描述:"+errormsg);
}
@Override
public void onProgress(int curIndex, int curPercent, int total,int totalPercent) {
//1、curIndex--表示當(dāng)前第幾個(gè)文件正在上傳
//2凛虽、curPercent--表示當(dāng)前上傳文件的進(jìn)度值(百分比)
//3死遭、total--表示總的上傳文件數(shù)
//4、totalPercent--表示總的上傳進(jìn)度(百分比)
}
});