RAUploadManager.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  1. package com.usai.util;
  2. import android.content.SharedPreferences;
  3. import android.os.Bundle;
  4. import android.util.Log;
  5. import com.usai.redant.raimage.RedAntApplication;
  6. import org.json.JSONException;
  7. import org.json.JSONObject;
  8. import java.io.ByteArrayOutputStream;
  9. import java.io.File;
  10. import java.io.ObjectOutputStream;
  11. import java.util.ArrayList;
  12. import java.util.List;
  13. import static com.usai.util.Network.URL_UPLOAD;
  14. /**
  15. * Created by ray on 13/06/2017.
  16. */
  17. public class RAUploadManager {
  18. public int maxThread=3;
  19. public int activeThread;
  20. public int maxRetry=2;
  21. public Boolean autoStart=true;
  22. public Boolean removeFinish=true;
  23. public Boolean removeError=false;
  24. public QueueStatus queue_status;
  25. public static final int RESULT_BARCODE_ERROR=-50;
  26. public TaskStatus newtaskStatus= TaskStatus.TaskStatusWait;
  27. public ArrayList<Bundle> arr_queue;
  28. // private List<Bundle> operation_queue;
  29. // private ExecutorService es = Executors.newFixedThreadPool(3);//
  30. // .newFixedThreadPool();
  31. // private CountDownLatch latch = new CountDownLatch(maxThread);
  32. private RAOperationQueue operation_queue;
  33. public enum QueueStatus {
  34. QueueStatusDefault,
  35. QueueStatusAdd,
  36. QueueStatusError,
  37. QueueStatusFinishWithError,
  38. QueueStatusFinish
  39. }
  40. public enum TaskStatus {
  41. TaskStatusStop,
  42. TaskStatusStart,
  43. TaskStatusError,
  44. TaskStatusWait,
  45. TaskStatusFinish,
  46. TaskStatusCancel,
  47. }
  48. public UIUpdateListener uiUpdateListener;
  49. public interface UIUpdateListener {
  50. void onProgress(long index, double percentage);
  51. void updateCell(long index, Bundle taskinfo);
  52. void updateList();
  53. // void onFinish(int code, String res/*, HashMap<String, List<String>> headers*/);
  54. }
  55. // class Poll implements Runnable {
  56. // public void run() {
  57. // // while (queue.size()>0) {
  58. // while (!operation_queue.isEmpty()) {
  59. // System.out.println(operation_queue.poll());
  60. // }
  61. // latch.countDown();
  62. // }
  63. // }
  64. public RAUploadManager()
  65. {
  66. queue_status = QueueStatus.QueueStatusDefault;
  67. SharedPreferences UMSetting = RedAntApplication.getInstance()
  68. .getSharedPreferences("UploadManager", 0);
  69. if(UMSetting!=null)
  70. {
  71. autoStart = UMSetting.getBoolean("auto_upload",true);
  72. removeFinish = UMSetting.getBoolean("auto_rm_finish",true);
  73. removeError = UMSetting.getBoolean("auto_rm_error",false);
  74. maxRetry = UMSetting.getInt("retry_count",2);
  75. newtaskStatus = TaskStatus.values()[UMSetting.getInt("newtask_status",TaskStatus.TaskStatusWait.ordinal())];
  76. maxThread = UMSetting.getInt("max_thread",3);
  77. }
  78. operation_queue = new RAOperationQueue();
  79. operation_queue.setCallback(new RAOperationQueue.OperationCallback() {
  80. @Override
  81. public Boolean operate(final Bundle taskinfo) {
  82. boolean ret=false;
  83. String path=taskinfo.getString("path");
  84. String url=taskinfo.getString("url")+""+URL_UPLOAD;
  85. JSONObject result=Network.UploadImage(path, taskinfo.getBundle("params"), url, new Network.FileUploadListener() {
  86. @Override
  87. public boolean interupt() {
  88. // if(taskinfo.getBoolean("iscancel",false))
  89. // return false;
  90. return taskinfo.getBoolean("iscancel",false);
  91. }
  92. @Override
  93. public void onProgress(long pro, double percentage) {
  94. synchronized(this){
  95. Log.d("", "onProgress: " + percentage);
  96. taskinfo.putDouble("progress",percentage);
  97. if (uiUpdateListener!=null) {
  98. int index = arr_queue.indexOf(taskinfo);
  99. // uiUpdateListener.onProgress(index,percentage);
  100. uiUpdateListener.updateCell(index,taskinfo);
  101. }
  102. }
  103. }
  104. @Override
  105. public void onFinish(int code, String res) {
  106. Log.d("", "onFinish: ");
  107. }
  108. });
  109. int r = 0;
  110. try {
  111. r = result.getInt("result");
  112. String rmsg=result.getString("msg");
  113. if(r==2|| r==RESULT_BARCODE_ERROR)
  114. {
  115. taskinfo.putInt("status",TaskStatus.TaskStatusFinish.ordinal());
  116. if(r==2)
  117. taskinfo.putString("msg","upload successful");
  118. else
  119. taskinfo.putString("msg","warring: "+rmsg );
  120. }
  121. else
  122. {
  123. if(taskinfo.getInt("retry",0)>=maxRetry)
  124. {
  125. taskinfo.putInt("status",TaskStatus.TaskStatusError.ordinal());
  126. taskinfo.putDouble("progress",0.0);
  127. taskinfo.putString("msg",rmsg);
  128. }
  129. else
  130. {
  131. taskinfo.putInt("retry",taskinfo.getInt("retry",0)+1);
  132. taskinfo.putInt("status",TaskStatus.TaskStatusWait.ordinal());
  133. taskinfo.putDouble("progress",0.0);
  134. taskinfo.putString("msg","connection lost, retry...");
  135. ret=true;
  136. }
  137. }
  138. synchronized (this)
  139. {
  140. if (uiUpdateListener!=null) {
  141. int index = arr_queue.indexOf(taskinfo);
  142. uiUpdateListener.updateCell(index,taskinfo);
  143. }
  144. }
  145. } catch (JSONException e) {
  146. e.printStackTrace();
  147. }
  148. return ret;
  149. // int a=0;
  150. // System.out.println(a+"running tid="+Thread.currentThread().getId());
  151. // int min=1000;
  152. // int max=5000;
  153. // int sleep=new Random().nextInt(max)%(max-min+1) + min;
  154. // try{
  155. // Thread.currentThread().sleep(sleep);
  156. // }catch(InterruptedException ie){
  157. // ie.printStackTrace();
  158. // }
  159. // System.out.println(a+" "+sleep+" finish tid="+Thread.currentThread().getId());
  160. }
  161. @Override
  162. public void operateFinish(Bundle taskinfo) {
  163. TaskStatus status= TaskStatus.values()[taskinfo.getInt("status",0)];
  164. boolean removefromlist=false;
  165. if (status==TaskStatus.TaskStatusFinish&&removeFinish)
  166. removefromlist=true;
  167. else if (status==TaskStatus.TaskStatusError&&removeError)
  168. removefromlist=true;
  169. if(removefromlist)
  170. {
  171. synchronized (this)
  172. {
  173. arr_queue.remove(taskinfo);
  174. uiUpdateListener.updateList();
  175. }
  176. }
  177. }
  178. });
  179. // operation_queue = new List<Bundle>() {};
  180. loadTask();
  181. }
  182. private void loadTask()
  183. {
  184. stopAllTasks();
  185. arr_queue = new ArrayList<Bundle>();
  186. // 此处缺少读取持久话保存任务队列的实现。
  187. };
  188. public void addTask(Bundle task)
  189. {
  190. arr_queue.add(task);
  191. if(newtaskStatus== TaskStatus.TaskStatusWait)
  192. {
  193. startTask(task);
  194. }
  195. };
  196. public void addTasks(ArrayList<Bundle> tasks)
  197. {
  198. arr_queue.addAll(tasks);
  199. if(newtaskStatus== TaskStatus.TaskStatusWait)
  200. {
  201. for (Bundle task:tasks)
  202. {
  203. startTask(task);
  204. }
  205. }
  206. };
  207. public void startTask(Bundle task)
  208. {
  209. operation_queue.addOperation(task);
  210. };
  211. public void removeTask(Bundle task)
  212. {
  213. arr_queue.remove(task);
  214. String path = filePath(task);
  215. File file = new File(path);
  216. if(file.exists())
  217. {
  218. file.delete();
  219. }
  220. };
  221. public void removeTasks(List<Bundle> tasks)
  222. {
  223. arr_queue.removeAll(tasks);
  224. for(Bundle task:tasks)
  225. {
  226. String path = filePath(task);
  227. File file = new File(path);
  228. if(file.exists())
  229. {
  230. file.delete();
  231. }
  232. }
  233. };
  234. public void stopAllTasks()
  235. {
  236. };
  237. public void stopTask(Bundle task)
  238. {
  239. if(task.getInt("status")!= TaskStatus.TaskStatusStart.ordinal()&&task.getInt("status")!= TaskStatus.TaskStatusWait.ordinal())
  240. return;
  241. task.putBoolean("iscancel",true);
  242. // long tid=task.getLong("tid",-1);
  243. // if(tid>0)
  244. // {
  245. //
  246. //
  247. // }
  248. // task.tet("tid",Thread.currentThread().getId());
  249. // RAUploadOperation
  250. }
  251. public void saveTasks()
  252. {
  253. SharedPreferences pref = RedAntApplication.getInstance()
  254. .getSharedPreferences("RA Image", 0);
  255. SharedPreferences.Editor editor = pref.edit();
  256. try {
  257. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  258. ObjectOutputStream oos = new ObjectOutputStream(baos);
  259. oos.writeObject(arr_queue);
  260. String personBase64 = android.util.Base64.encodeToString(baos.toByteArray(), android.util.Base64.DEFAULT);//new String(Base64.encodeBase64(baos.toByteArray()));
  261. }
  262. catch (Exception e)
  263. {
  264. }
  265. // if (m_swSave.isChecked()&&!TextUtils.isEmpty(encryptPass)&&!TextUtils.isEmpty(encryptUser))
  266. // {
  267. // editor.putString("user", encryptUser);
  268. // editor.putString("password", encryptPass);
  269. // editor.putBoolean("kepppass", true);
  270. // }
  271. // else
  272. // {
  273. // editor.putString("user", null);
  274. // editor.putString("password", null);
  275. // editor.putBoolean("kepppass", false);
  276. // }
  277. //
  278. // editor.puts
  279. //
  280. // editor.commit();
  281. };
  282. private String filePath(Bundle task)
  283. {
  284. // String path = Environment.getExternalStorageDirectory().getPath();
  285. // path+="/"+task.getString("path");
  286. // path+="/"+task.getString("file");
  287. return task.getString("path","");
  288. }
  289. }