RAUploadManager.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524
  1. package com.usai.util;
  2. import android.content.SharedPreferences;
  3. import android.os.Bundle;
  4. import android.util.Base64;
  5. import android.util.Log;
  6. import com.usai.redant.raimage.RedAntApplication;
  7. import org.json.JSONException;
  8. import org.json.JSONObject;
  9. import java.io.ByteArrayInputStream;
  10. import java.io.ByteArrayOutputStream;
  11. import java.io.File;
  12. import java.io.IOException;
  13. import java.io.ObjectInputStream;
  14. import java.io.ObjectOutputStream;
  15. import java.util.ArrayList;
  16. import java.util.List;
  17. import static com.usai.util.Network.URL_UPLOAD;
  18. /**
  19. * Created by ray on 13/06/2017.
  20. */
  21. public class RAUploadManager {
  22. public int maxThread=3;
  23. public int activeThread;
  24. public int maxRetry=2;
  25. public Boolean autoStart=true;
  26. public Boolean removeFinish=true;
  27. public Boolean removeError=false;
  28. public QueueStatus queue_status;
  29. public static final int RESULT_BARCODE_ERROR=-50;
  30. public TaskStatus newtaskStatus= TaskStatus.TaskStatusWait;
  31. public ArrayList<Bundle> arr_queue;
  32. // private List<Bundle> operation_queue;
  33. // private ExecutorService es = Executors.newFixedThreadPool(3);//
  34. // .newFixedThreadPool();
  35. // private CountDownLatch latch = new CountDownLatch(maxThread);
  36. private RAOperationQueue operation_queue;
  37. public enum QueueStatus {
  38. QueueStatusDefault,
  39. QueueStatusAdd,
  40. QueueStatusError,
  41. QueueStatusFinishWithError,
  42. QueueStatusFinish
  43. }
  44. public enum TaskStatus {
  45. TaskStatusStop,
  46. TaskStatusStart,
  47. TaskStatusError,
  48. TaskStatusWait,
  49. TaskStatusFinish,
  50. TaskStatusCancel,
  51. }
  52. public UIUpdateListener uiUpdateListener;
  53. public interface UIUpdateListener {
  54. void onProgress(long index, double percentage);
  55. void updateCell(long index, Bundle taskinfo);
  56. void updateList();
  57. // void onFinish(int code, String res/*, HashMap<String, List<String>> headers*/);
  58. }
  59. // class Poll implements Runnable {
  60. // public void run() {
  61. // // while (queue.size()>0) {
  62. // while (!operation_queue.isEmpty()) {
  63. // System.out.println(operation_queue.poll());
  64. // }
  65. // latch.countDown();
  66. // }
  67. // }
  68. public RAUploadManager()
  69. {
  70. queue_status = QueueStatus.QueueStatusDefault;
  71. SharedPreferences UMSetting = RedAntApplication.getInstance()
  72. .getSharedPreferences("UploadManager", 0);
  73. if(UMSetting!=null)
  74. {
  75. autoStart = UMSetting.getBoolean("auto_upload",true);
  76. removeFinish = UMSetting.getBoolean("auto_rm_finish",true);
  77. removeError = UMSetting.getBoolean("auto_rm_error",false);
  78. maxRetry = UMSetting.getInt("retry_count",2);
  79. newtaskStatus = TaskStatus.values()[UMSetting.getInt("newtask_status",TaskStatus.TaskStatusWait.ordinal())];
  80. maxThread = UMSetting.getInt("max_thread",3);
  81. }
  82. operation_queue = new RAOperationQueue();
  83. operation_queue.setCallback(new RAOperationQueue.OperationCallback() {
  84. @Override
  85. public Boolean operate(final Bundle taskinfo) {
  86. boolean ret=false;
  87. String path=taskinfo.getString("path");
  88. String url=taskinfo.getString("url")+""+URL_UPLOAD;
  89. JSONObject result=Network.UploadImage(path, taskinfo.getBundle("params"), url, new Network.FileUploadListener() {
  90. @Override
  91. public boolean interupt() {
  92. // if(taskinfo.getBoolean("iscancel",false))
  93. // return false;
  94. return taskinfo.getBoolean("iscancel",false);
  95. }
  96. @Override
  97. public void onProgress(long pro, double percentage) {
  98. synchronized(this){
  99. Log.d("", "onProgress: " + percentage);
  100. taskinfo.putDouble("progress",percentage);
  101. if (uiUpdateListener!=null) {
  102. int index = arr_queue.indexOf(taskinfo);
  103. // uiUpdateListener.onProgress(index,percentage);
  104. uiUpdateListener.updateCell(index,taskinfo);
  105. }
  106. }
  107. }
  108. @Override
  109. public void onFinish(int code, String res) {
  110. Log.d("", "onFinish: ");
  111. }
  112. });
  113. int r = 0;
  114. try {
  115. r = result.getInt("result");
  116. String rmsg=result.getString("msg");
  117. if(r==2|| r==RESULT_BARCODE_ERROR)
  118. {
  119. taskinfo.putInt("status",TaskStatus.TaskStatusFinish.ordinal());
  120. if(r==2)
  121. taskinfo.putString("msg","upload successful");
  122. else
  123. taskinfo.putString("msg","warring: "+rmsg );
  124. }
  125. else
  126. {
  127. if(taskinfo.getInt("retry",0)>=maxRetry)
  128. {
  129. taskinfo.putInt("status",TaskStatus.TaskStatusError.ordinal());
  130. taskinfo.putDouble("progress",0.0);
  131. taskinfo.putString("msg",rmsg);
  132. }
  133. else
  134. {
  135. taskinfo.putInt("retry",taskinfo.getInt("retry",0)+1);
  136. taskinfo.putInt("status",TaskStatus.TaskStatusWait.ordinal());
  137. taskinfo.putDouble("progress",0.0);
  138. taskinfo.putString("msg","connection lost, retry...");
  139. ret=true;
  140. }
  141. }
  142. } catch (JSONException e) {
  143. // String rmsg=result.getString("msg");
  144. taskinfo.putInt("status",TaskStatus.TaskStatusError.ordinal());
  145. taskinfo.putDouble("progress",0.0);
  146. taskinfo.putString("msg","can not upload, please contact administrator.");
  147. e.printStackTrace();
  148. }
  149. finally {
  150. synchronized (this)
  151. {
  152. if (uiUpdateListener!=null) {
  153. int index = arr_queue.indexOf(taskinfo);
  154. uiUpdateListener.updateCell(index,taskinfo);
  155. }
  156. }
  157. }
  158. return ret;
  159. // int a=0;
  160. // System.out.println(a+"running tid="+Thread.currentThread().getId());
  161. // int min=1000;
  162. // int max=5000;
  163. // int sleep=new Random().nextInt(max)%(max-min+1) + min;
  164. // try{
  165. // Thread.currentThread().sleep(sleep);
  166. // }catch(InterruptedException ie){
  167. // ie.printStackTrace();
  168. // }
  169. // System.out.println(a+" "+sleep+" finish tid="+Thread.currentThread().getId());
  170. }
  171. @Override
  172. public void operateFinish(Bundle taskinfo) {
  173. TaskStatus status= TaskStatus.values()[taskinfo.getInt("status",0)];
  174. boolean removefromlist=false;
  175. if (status==TaskStatus.TaskStatusFinish&&removeFinish)
  176. removefromlist=true;
  177. else if (status==TaskStatus.TaskStatusError&&removeError)
  178. removefromlist=true;
  179. synchronized (this)
  180. {
  181. if(removefromlist)
  182. {
  183. arr_queue.remove(taskinfo);
  184. if(uiUpdateListener!=null)
  185. uiUpdateListener.updateList();
  186. }
  187. saveTasks();
  188. }
  189. }
  190. });
  191. // operation_queue = new List<Bundle>() {};
  192. loadTask();
  193. }
  194. private void loadTask()
  195. {
  196. stopAllTasks();
  197. arr_queue = new ArrayList<Bundle>();
  198. Log.d("_RAIMAGE", "saveTasks: RAUploadManager");
  199. SharedPreferences pref = RedAntApplication.getInstance()
  200. .getSharedPreferences("RA Image", 0);
  201. try {
  202. String tasksBase64 = pref.getString("task_list", "");
  203. // ArrayList<String> wrap_arr = new ArrayList<String>();
  204. // for( Bundle b:arr_queue)
  205. // {
  206. // String sjson=RAUtil.Bundle2Json(b).toString();
  207. // Log.d("_RAIMAGE", "saveTasks: "+sjson);
  208. // wrap_arr.add(sjson);
  209. // }
  210. //
  211. // ByteArrayOutputStream baos = new ByteArrayOutputStream();
  212. // ObjectOutputStream oos = new ObjectOutputStream(baos);
  213. // oos.writeObject(wrap_arr);
  214. //
  215. // String tasksBase64 = android.util.Base64.encodeToString(baos.toByteArray(), android.util.Base64.DEFAULT);//new String(Base64.encodeBase64(baos.toByteArray()));
  216. //
  217. //
  218. // editor.putString("task_list", tasksBase64);
  219. //
  220. //
  221. // editor.commit();
  222. if(tasksBase64.length()>0)
  223. {
  224. byte[] decode=Base64.decode(tasksBase64,Base64.DEFAULT);
  225. ByteArrayInputStream bais= new ByteArrayInputStream(decode);
  226. ObjectInputStream ois = null;
  227. ois = new ObjectInputStream(bais);
  228. ArrayList<String> arr_load=(ArrayList<String>)ois.readObject();
  229. for(String s:arr_load)
  230. {
  231. Log.d("_RAIMAGE", "loadTask: "+s);
  232. JSONObject jsobj = new JSONObject(s);
  233. Bundle b=RAUtil.Json2Bundle(jsobj);
  234. arr_queue.add(b);
  235. // String sjson=RAUtil.Bundle2Json(b).toString();
  236. // wrap_arr.add(sjson);
  237. }
  238. }
  239. } catch (IOException e) {
  240. e.printStackTrace();
  241. } catch (ClassNotFoundException e) {
  242. e.printStackTrace();
  243. } catch (JSONException e) {
  244. e.printStackTrace();
  245. }
  246. for(Bundle b:arr_queue)
  247. {
  248. startTask(b);
  249. }
  250. // int a = 0;
  251. // 此处缺少读取持久话保存任务队列的实现。
  252. }
  253. public void addTask(Bundle task)
  254. {
  255. arr_queue.add(task);
  256. synchronized (this)
  257. {
  258. saveTasks();
  259. }
  260. if(newtaskStatus== TaskStatus.TaskStatusWait)
  261. {
  262. startTask(task);
  263. }
  264. };
  265. public void addTasks(ArrayList<Bundle> tasks)
  266. {
  267. arr_queue.addAll(tasks);
  268. synchronized (this)
  269. {
  270. saveTasks();
  271. }
  272. if(newtaskStatus== TaskStatus.TaskStatusWait)
  273. {
  274. for (Bundle task:tasks)
  275. {
  276. startTask(task);
  277. }
  278. }
  279. };
  280. public void startTask(Bundle task)
  281. {
  282. operation_queue.addOperation(task);
  283. };
  284. public void clearTask()
  285. {
  286. ArrayList<Bundle> remove = new ArrayList<Bundle>();
  287. for(Bundle b:arr_queue)
  288. {
  289. if(TaskStatus.values()[b.getInt("status",0)]==TaskStatus.TaskStatusStart||TaskStatus.values()[b.getInt("status",0)]==TaskStatus.TaskStatusWait)
  290. continue;
  291. remove.add(b);
  292. // removeTask(b);
  293. }
  294. removeTasks(remove);
  295. }
  296. public void removeTask(Bundle task)
  297. {
  298. arr_queue.remove(task);
  299. synchronized (this)
  300. {
  301. saveTasks();
  302. }
  303. String path = filePath(task);
  304. File file = new File(path);
  305. if(file.exists())
  306. {
  307. file.delete();
  308. }
  309. };
  310. public void removeTasks(List<Bundle> tasks)
  311. {
  312. arr_queue.removeAll(tasks);
  313. synchronized (this)
  314. {
  315. saveTasks();
  316. }
  317. for(Bundle task:tasks)
  318. {
  319. String path = filePath(task);
  320. File file = new File(path);
  321. if(file.exists())
  322. {
  323. file.delete();
  324. }
  325. }
  326. };
  327. public void stopAllTasks()
  328. {
  329. if(arr_queue==null)
  330. return;
  331. for (Bundle task:arr_queue)
  332. {
  333. stopTask(task);
  334. }
  335. };
  336. public void stopTask(Bundle task)
  337. {
  338. if(task.getInt("status")!= TaskStatus.TaskStatusStart.ordinal()&&task.getInt("status")!= TaskStatus.TaskStatusWait.ordinal())
  339. return;
  340. task.putBoolean("iscancel",true);
  341. // long tid=task.getLong("tid",-1);
  342. // if(tid>0)
  343. // {
  344. //
  345. //
  346. // }
  347. // task.tet("tid",Thread.currentThread().getId());
  348. // RAUploadOperation
  349. }
  350. public void saveTasks()
  351. {
  352. Log.d("_RAIMAGE", "saveTasks: RAUploadManager");
  353. SharedPreferences pref = RedAntApplication.getInstance()
  354. .getSharedPreferences("RA Image", 0);
  355. SharedPreferences.Editor editor = pref.edit();
  356. try {
  357. ArrayList<String> wrap_arr = new ArrayList<String>();
  358. for( Bundle b:arr_queue)
  359. {
  360. String sjson=RAUtil.Bundle2Json(b).toString();
  361. Log.d("_RAIMAGE", "saveTasks: "+sjson);
  362. wrap_arr.add(sjson);
  363. }
  364. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  365. ObjectOutputStream oos = new ObjectOutputStream(baos);
  366. oos.writeObject(wrap_arr);
  367. String tasksBase64 = android.util.Base64.encodeToString(baos.toByteArray(), android.util.Base64.DEFAULT);//new String(Base64.encodeBase64(baos.toByteArray()));
  368. editor.putString("task_list", tasksBase64);
  369. editor.commit();
  370. // byte[] decode=Base64.decode(personBase64,Base64.DEFAULT);
  371. // ByteArrayInputStream bais= new ByteArrayInputStream(decode);
  372. //
  373. // ObjectInputStream ois = new ObjectInputStream(bais);
  374. // ArrayList<String> arr_load=(ArrayList<String>)ois.readObject();
  375. // int a = 0;
  376. }
  377. catch (Exception e)
  378. {
  379. e.printStackTrace();
  380. }
  381. // if (m_swSave.isChecked()&&!TextUtils.isEmpty(encryptPass)&&!TextUtils.isEmpty(encryptUser))
  382. // {
  383. // editor.putString("user", encryptUser);
  384. // editor.putString("password", encryptPass);
  385. // editor.putBoolean("kepppass", true);
  386. // }
  387. // else
  388. // {
  389. // editor.putString("user", null);
  390. // editor.putString("password", null);
  391. // editor.putBoolean("kepppass", false);
  392. // }
  393. //
  394. // editor.puts
  395. //
  396. // editor.commit();
  397. };
  398. private String filePath(Bundle task)
  399. {
  400. // String path = Environment.getExternalStorageDirectory().getPath();
  401. // path+="/"+task.getString("path");
  402. // path+="/"+task.getString("file");
  403. return task.getString("path","");
  404. }
  405. }