AsyncFileUpload.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  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. String[] urlArr = ossUrl.split("/");
  146. fileName = urlArr[urlArr.length-1];
  147. //用户循环路径
  148. for (int i = 0; i <urlArr.length -1 ; i++) {
  149. if (!urlArr[i].isEmpty()){
  150. path_prefix = path_prefix.concat(urlArr[i]).concat("/");
  151. }
  152. }
  153. if (ossService ==null){
  154. ossService = new OssService(mContext,path_prefix);
  155. }
  156. ossService.ossUpload(urlPath, fileName , num,uploadHandler,path_prefix);
  157. //ossService.ossUpload(urlPath, fileName , num,uploadHandler);
  158. setIsFinish(awaitUploadList.get(num).getId(),1);
  159. }
  160. public int getAwaitNum(){
  161. RealmResults<AsyncUploadRealm> realmResults = mRealm.where(AsyncUploadRealm.class)
  162. .equalTo("isDelete",0)
  163. .equalTo("pushStatus",0)
  164. .equalTo("uploadType",uploadType)
  165. .sort("pushStatus").findAll();
  166. realmResults.load();
  167. return realmResults.size();
  168. }
  169. public int getAwaitNum(String[] uploadTypeList){
  170. RealmResults<AsyncUploadRealm> realmResults = mRealm.where(AsyncUploadRealm.class)
  171. .equalTo("isDelete",0)
  172. .equalTo("pushStatus",0)
  173. .in("uploadType",uploadTypeList)
  174. .sort("pushStatus").findAll();
  175. realmResults.load();
  176. return realmResults.size();
  177. }
  178. public int getAllAwaitNum(){
  179. RealmResults<AsyncUploadRealm> realmResults = mRealm.where(AsyncUploadRealm.class)
  180. .equalTo("isDelete",0)
  181. .equalTo("pushStatus",0)
  182. .sort("pushStatus").findAll();
  183. realmResults.load();
  184. return realmResults.size();
  185. }
  186. //存储数据问题
  187. private void asyncUpload(){
  188. if (awaitUploadList==null || awaitUploadList.size()==0){
  189. Integer[] isFinish = {0,2};
  190. RealmResults<AsyncUploadRealm> realmResults = getBatchUploadRealm(isFinish);
  191. if (realmResults.size()==0){
  192. Integer[] isFinish2 = {0,1,2};
  193. realmResults = getBatchUploadRealm(isFinish2);
  194. }
  195. awaitUploadList.addAll(realmResults);
  196. }
  197. if (awaitUploadList.size()>0){
  198. filedUpload(0);
  199. }else{
  200. removeHandler();
  201. }
  202. }
  203. //取消任务
  204. public void taskCancel(){
  205. }
  206. public void setStartUpload(){
  207. allowUpload = true;
  208. asyncUpload();
  209. }
  210. public void setStopUpload(){
  211. allowUpload = false;
  212. if(ossService !=null){
  213. ossService.taskCancel();
  214. }
  215. EventBus.getDefault().post(new UploadProgressEvent(0));
  216. }
  217. /**
  218. * 设置是否完成
  219. * @param realmId String
  220. * @param isFinish Integer
  221. */
  222. private void setIsFinish(String realmId,Integer isFinish){
  223. //更新值
  224. mRealm.beginTransaction();
  225. AsyncUploadRealm myObject = mRealm.where(AsyncUploadRealm.class).equalTo("id",realmId).findFirst();
  226. assert myObject != null;
  227. myObject.setIsFinish(isFinish);
  228. mRealm.commitTransaction();
  229. }
  230. private RealmResults<AsyncUploadRealm> getBatchUploadRealm(Integer[] isFinish){
  231. //更新值
  232. RealmResults<AsyncUploadRealm> realmResults = mRealm.where(AsyncUploadRealm.class)
  233. .equalTo("isDelete",0)
  234. .equalTo("pushStatus",0)
  235. .in("isFinish",isFinish)
  236. // .equalTo("notifyKey",fileKey)
  237. // .equalTo("uploadType",uploadType)
  238. .sort("pushStatus").findAll();
  239. realmResults.load();
  240. return realmResults;
  241. }
  242. /**
  243. * 上传结果
  244. * @param tmpRealmId String
  245. * @param status Integer
  246. * @param photoPath String
  247. */
  248. private void resultUpload(String tmpRealmId,Integer status,String photoPath){
  249. if (tmpRealmId!=null && !tmpRealmId.isEmpty()){
  250. //遍历删除
  251. if (awaitUploadList.size()>0){
  252. for (int i=0;i<awaitUploadList.size();i++){
  253. if (awaitUploadList.get(i).getId().equals(tmpRealmId)){
  254. awaitUploadList.remove(i);
  255. break;
  256. }
  257. }
  258. }
  259. //更新值
  260. mRealm.beginTransaction();
  261. AsyncUploadRealm myObject = mRealm.where(AsyncUploadRealm.class).equalTo("id",tmpRealmId).findFirst();
  262. assert myObject != null;
  263. int pushStatus = 2;
  264. int rePush = myObject.getRePush();
  265. if (status==0){
  266. pushStatus = rePush>4 ? 1 : 0;
  267. }
  268. if (myObject.getPushStatus()!=3){
  269. myObject.setPushStatus(pushStatus);
  270. }
  271. //已完成则不需要再更新
  272. if (myObject.getIsFinish() != 3){
  273. myObject.setIsFinish( status == 1 ? 3 : 2);
  274. }
  275. if (status == 1){
  276. myObject.setOssUrl(photoPath);
  277. }else{
  278. myObject.setRePush(myObject.getRePush()+1);
  279. }
  280. mRealm.commitTransaction();
  281. }
  282. //可以允许上传
  283. if (allowUpload){
  284. //上传完,继续执行
  285. asyncUpload();
  286. }
  287. }
  288. private void setPushStatus(String realmId,Integer pushStatus,int isDelete){
  289. //更新值
  290. mRealm.beginTransaction();
  291. AsyncUploadRealm myObject = mRealm.where(AsyncUploadRealm.class).equalTo("id",realmId).findFirst();
  292. assert myObject != null;
  293. myObject.setPushStatus(pushStatus);
  294. myObject.setIsDelete(isDelete);
  295. mRealm.commitTransaction();
  296. }
  297. //销毁
  298. public void removeHandler(){
  299. if (uploadHandler!=null){
  300. uploadHandler.removeCallbacksAndMessages(null);
  301. }
  302. }
  303. }