AsyncFileUpload.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  1. package com.fxy.common;
  2. import android.annotation.SuppressLint;
  3. import android.app.Activity;
  4. import android.content.Context;
  5. import android.net.ConnectivityManager;
  6. import android.net.NetworkInfo;
  7. import android.os.Handler;
  8. import android.os.Message;
  9. import android.widget.Toast;
  10. import com.elvishew.xlog.XLog;
  11. import com.fxy.baselibrary.bean.BaseEventBusBean;
  12. import com.fxy.baselibrary.util.JsonUtil;
  13. import com.fxy.baselibrary.util.RxTimeTool;
  14. import com.fxy.bean.ActionBean;
  15. import com.fxy.constant.EventCode;
  16. import com.fxy.constant.SPCache;
  17. import com.fxy.net.MyDialogCallback;
  18. import com.fxy.realm.AsyncUploadRealm;
  19. import com.luck.picture.lib.entity.LocalMedia;
  20. import com.lzy.okgo.OkGo;
  21. import com.lzy.okgo.model.Response;
  22. import org.greenrobot.eventbus.EventBus;
  23. import org.json.JSONObject;
  24. import java.io.File;
  25. import java.util.ArrayList;
  26. import java.util.HashMap;
  27. import java.util.List;
  28. import java.util.UUID;
  29. import io.realm.Realm;
  30. import io.realm.RealmResults;
  31. public class AsyncFileUpload {
  32. private final Context mContext;
  33. private String uploadType = "";
  34. //文件上传类型
  35. protected String fileKey = "";
  36. protected Realm mRealm;
  37. private List<AsyncUploadRealm> awaitUploadList=new ArrayList<>();
  38. private OssService ossService;
  39. private boolean allowUpload = true;
  40. public AsyncFileUpload(Context context){
  41. mContext = context;
  42. initData();
  43. }
  44. private void initData() {
  45. mRealm = Realm.getDefaultInstance();
  46. }
  47. public void setUploadType(String fileKey) {
  48. this.fileKey = fileKey;
  49. }
  50. @SuppressLint("HandlerLeak")
  51. private Handler uploadHandler = new Handler() {
  52. @Override
  53. public void handleMessage(Message msg) {
  54. HashMap<String,Object> hashMap = new HashMap<>();
  55. hashMap.put("fileKey",fileKey);
  56. boolean result = false;
  57. try {
  58. //XLog.e(msg);
  59. int current = (Integer) msg.arg1;
  60. switch (msg.what){
  61. case 0:
  62. break;
  63. case 1://失败
  64. if (awaitUploadList.size()>0){
  65. AsyncUploadRealm asyncUploadRealm = awaitUploadList.get(current);
  66. awaitUploadList.remove(current);
  67. resultUpload(asyncUploadRealm.getId(),0,"");
  68. hashMap.put("error",(String) msg.obj);
  69. hashMap.put("result","error");
  70. hashMap.put("realmId",asyncUploadRealm.getId());
  71. }
  72. break;
  73. case 2://成功
  74. result = true;
  75. //表示数据存在
  76. if (awaitUploadList.size()>0){
  77. AsyncUploadRealm asyncUploadRealm = awaitUploadList.get(current);
  78. awaitUploadList.remove(current);
  79. resultUpload(asyncUploadRealm.getId(),1,(String) msg.obj);
  80. hashMap.put("result","success");
  81. hashMap.put("realmId",asyncUploadRealm.getId());
  82. }
  83. break;
  84. case 3:
  85. //设置进度条
  86. EventBus.getDefault().post(new UploadProgressEvent(msg.arg2));
  87. hashMap.put("result","process");
  88. hashMap.put("process",(int)msg.arg2);
  89. if (awaitUploadList.get(current)!=null){
  90. hashMap.put("realmId",awaitUploadList.get(current).getId());
  91. }
  92. EventBus.getDefault().post(new BaseEventBusBean<>(EventCode.file_upload_progress_lister,hashMap));
  93. return;
  94. //progressDialog.show();
  95. case 4:
  96. //获取上传状态
  97. return;
  98. default:
  99. break;
  100. }
  101. } catch (Exception e) {
  102. XLog.e(e.getMessage());
  103. e.printStackTrace();
  104. // 通过接口对象传上传状态
  105. hashMap.put("error",e.getMessage());
  106. }
  107. hashMap.put("result",false);
  108. EventBus.getDefault().post(new BaseEventBusBean<>(EventCode.file_upload_lister,hashMap));
  109. }
  110. };
  111. // 调用回调方法
  112. //uploadChangeListener.uploadResult(false);
  113. public void filedUpload(int num){
  114. // 例如 LocalMedia 里面返回三种path
  115. // 1.media.getPath(); 为原图path
  116. // 2.media.getCutPath();为裁剪后path,需判断media.isCut();是否为true
  117. // 3.media.getCompressPath();为压缩后path,需判断media.isCompressed();是否为true
  118. // 如果裁剪并压缩了,以取压缩路径为准,因为是先裁剪后压缩的
  119. LocalMedia localMedia = awaitUploadList.get(num).getLocalMedia();
  120. String urlPath =localMedia.getPath();
  121. if (urlPath.isEmpty()){
  122. Message msg = new Message();
  123. msg.obj = "文件路径不存在";
  124. msg.what = 1;
  125. uploadHandler.sendMessage(msg);
  126. return;
  127. }
  128. if (localMedia.isCompressed() && localMedia.getCompressPath()!=null){
  129. if (new File(localMedia.getCompressPath()).exists()){
  130. urlPath = localMedia.getCompressPath();
  131. }
  132. }
  133. String fileName = "";
  134. String path_prefix = "";
  135. String ossUrl = awaitUploadList.get(num).getOssUrl();
  136. fileKey = awaitUploadList.get(num).getNotifyKey();
  137. //目录为空
  138. if (ossUrl.isEmpty()){
  139. setPushStatus(awaitUploadList.get(num).getId(),1,1);
  140. if (awaitUploadList.size()>0){
  141. resultUpload(awaitUploadList.get(num).getId(),0,"");
  142. }
  143. return;
  144. }
  145. // 找到最后一个斜杠的位置
  146. int lastSlashIndex = ossUrl.lastIndexOf('/');
  147. // 如果找到了斜杠,则从斜杠之后的位置开始切割
  148. fileName = ossUrl.substring(lastSlashIndex + 1);
  149. path_prefix = ossUrl.substring(0,lastSlashIndex+ 1);
  150. if (ossService ==null){
  151. ossService = new OssService(mContext,path_prefix);
  152. }
  153. ossService.ossUpload(urlPath, fileName , num,uploadHandler,path_prefix);
  154. //ossService.ossUpload(urlPath, fileName , num,uploadHandler);
  155. setIsFinish(awaitUploadList.get(num).getId(),1);
  156. }
  157. public int getAwaitNum(){
  158. RealmResults<AsyncUploadRealm> realmResults = mRealm.where(AsyncUploadRealm.class)
  159. .equalTo("isDelete",0)
  160. .equalTo("pushStatus",0)
  161. .equalTo("uploadType",uploadType)
  162. .sort("pushStatus").findAll();
  163. realmResults.load();
  164. return realmResults.size();
  165. }
  166. public int getAwaitNum(String[] uploadTypeList){
  167. RealmResults<AsyncUploadRealm> realmResults = mRealm.where(AsyncUploadRealm.class)
  168. .equalTo("isDelete",0)
  169. .equalTo("pushStatus",0)
  170. .in("uploadType",uploadTypeList)
  171. .sort("pushStatus").findAll();
  172. realmResults.load();
  173. return realmResults.size();
  174. }
  175. public int getAllAwaitNum(){
  176. RealmResults<AsyncUploadRealm> realmResults = mRealm.where(AsyncUploadRealm.class)
  177. .equalTo("isDelete",0)
  178. .equalTo("pushStatus",0)
  179. .sort("pushStatus").findAll();
  180. realmResults.load();
  181. return realmResults.size();
  182. }
  183. //存储数据问题
  184. private void asyncUpload(){
  185. if (awaitUploadList==null || awaitUploadList.size()==0){
  186. Integer[] isFinish = {0,2};
  187. RealmResults<AsyncUploadRealm> realmResults = getBatchUploadRealm(isFinish);
  188. if (realmResults.size()==0){
  189. Integer[] isFinish2 = {0,1,2};
  190. realmResults = getBatchUploadRealm(isFinish2);
  191. }
  192. awaitUploadList.addAll(realmResults);
  193. }
  194. if (awaitUploadList.size()>0){
  195. filedUpload(0);
  196. }else{
  197. removeHandler();
  198. }
  199. }
  200. //取消任务
  201. public void taskCancel(){
  202. }
  203. public void setStartUpload(){
  204. allowUpload = true;
  205. asyncUpload();
  206. }
  207. public void setStopUpload(){
  208. allowUpload = false;
  209. if(ossService !=null){
  210. ossService.taskCancel();
  211. }
  212. EventBus.getDefault().post(new UploadProgressEvent(0));
  213. }
  214. /**
  215. * 设置是否完成
  216. * @param realmId String
  217. * @param isFinish Integer
  218. */
  219. private void setIsFinish(String realmId,Integer isFinish){
  220. //更新值
  221. mRealm.beginTransaction();
  222. AsyncUploadRealm myObject = mRealm.where(AsyncUploadRealm.class).equalTo("id",realmId).findFirst();
  223. assert myObject != null;
  224. myObject.setIsFinish(isFinish);
  225. mRealm.commitTransaction();
  226. }
  227. private RealmResults<AsyncUploadRealm> getBatchUploadRealm(Integer[] isFinish){
  228. //更新值
  229. RealmResults<AsyncUploadRealm> realmResults = mRealm.where(AsyncUploadRealm.class)
  230. .equalTo("isDelete",0)
  231. .equalTo("pushStatus",0)
  232. .in("isFinish",isFinish)
  233. // .equalTo("notifyKey",fileKey)
  234. // .equalTo("uploadType",uploadType)
  235. .sort("pushStatus").findAll();
  236. realmResults.load();
  237. return realmResults;
  238. }
  239. /**
  240. * 上传结果
  241. * @param tmpRealmId String
  242. * @param status Integer
  243. * @param photoPath String
  244. */
  245. private void resultUpload(String tmpRealmId,Integer status,String photoPath){
  246. if (tmpRealmId!=null && !tmpRealmId.isEmpty()){
  247. //遍历删除
  248. if (awaitUploadList.size()>0){
  249. for (int i=0;i<awaitUploadList.size();i++){
  250. if (awaitUploadList.get(i).getId().equals(tmpRealmId)){
  251. awaitUploadList.remove(i);
  252. break;
  253. }
  254. }
  255. }
  256. //更新值
  257. mRealm.beginTransaction();
  258. AsyncUploadRealm myObject = mRealm.where(AsyncUploadRealm.class).equalTo("id",tmpRealmId).findFirst();
  259. assert myObject != null;
  260. int pushStatus = 2;
  261. int rePush = myObject.getRePush();
  262. if (status==0){
  263. pushStatus = rePush>4 ? 1 : 0;
  264. }
  265. if (myObject.getPushStatus()!=3){
  266. myObject.setPushStatus(pushStatus);
  267. }
  268. //已完成则不需要再更新
  269. if (myObject.getIsFinish() != 3){
  270. myObject.setIsFinish( status == 1 ? 3 : 2);
  271. }
  272. if (status == 1){
  273. myObject.setOssUrl(photoPath);
  274. }else{
  275. myObject.setRePush(myObject.getRePush()+1);
  276. }
  277. mRealm.commitTransaction();
  278. }
  279. //可以允许上传
  280. if (allowUpload){
  281. //上传完,继续执行
  282. asyncUpload();
  283. }
  284. }
  285. private void setPushStatus(String realmId,Integer pushStatus,int isDelete){
  286. //更新值
  287. mRealm.beginTransaction();
  288. AsyncUploadRealm myObject = mRealm.where(AsyncUploadRealm.class).equalTo("id",realmId).findFirst();
  289. assert myObject != null;
  290. myObject.setPushStatus(pushStatus);
  291. myObject.setIsDelete(isDelete);
  292. mRealm.commitTransaction();
  293. }
  294. //销毁
  295. public void removeHandler(){
  296. if (uploadHandler!=null){
  297. uploadHandler.removeCallbacksAndMessages(null);
  298. }
  299. }
  300. }