AsyncFileUpload.java 13 KB

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