基于OKhttp循环队列发送心跳包,上传,多条上传 管理类
来源:互联网 发布:淘宝直播抽奖狂点屏幕 编辑:程序博客网 时间:2024/06/07 10:29
package com.omniteaching.otscale.system.formula;import android.content.Context;import android.text.TextUtils;import com.google.gson.Gson;import com.google.gson.reflect.TypeToken;import com.omniteaching.otscale.model.formulaC.FormulaMutilInvoiceInfo;import com.omniteaching.otscale.system.scale.utils.WeightFormat;import com.omniteaching.otscale.ui.formula.http.FormulaOkHttpListener;import com.omniteaching.otscale.ui.formula.http.IUploadMultipleListener;import com.omniteaching.otscale.ui.formula.model.FormulaMulitTasks;import com.omniteaching.otscale.ui.formula.model.FormulaRegisterModel;import com.omniteaching.otscale.utils.Globals;import com.squareup.okhttp.Call;import com.squareup.okhttp.Callback;import com.squareup.okhttp.FormEncodingBuilder;import com.squareup.okhttp.OkHttpClient;import com.squareup.okhttp.Request;import com.squareup.okhttp.RequestBody;import com.squareup.okhttp.Response;import com.squareup.okhttp.ResponseBody;import java.io.IOException;import java.net.HttpURLConnection;import java.text.DecimalFormat;import java.util.ArrayList;import java.util.HashMap;import java.util.concurrent.LinkedBlockingDeque;import java.util.concurrent.TimeUnit;import static com.omniteaching.otscale.ui.formula.http.FormulaHttps.AUTHORIZATION;import static com.omniteaching.otscale.ui.formula.http.FormulaHttps.URL_MULTIPLE_REGISTGER_FORMULA;import static com.omniteaching.otscale.ui.formula.http.FormulaHttps.getLocationToken;/** * Created by Administrator on 2016/4/26. */public class FormulaMutilHttpManager{ private static final String TAG = FormulaMutilHttpManager.class.getSimpleName(); private static FormulaMutilHttpManager mInstance; private static Context mContext; // private WifiManager.MulticastLock mLock;//UDP解锁刷新 public static final int OFFLINE = 0; // 离线 public static final int IDLE = 1; // 空闲 public static final int WORKING = 2; // 工作中 public static final int PAUSE = 4; // 暂停 public static final int CANCEL = 8; // 取消 public static final String CANCEL_STRING = "cancel"; /** * 消息格式 请求时间 */ //KEY public static final String DeviceKey = "Device"; public static final String TitleKey = "Title"; public static final String MaxRangeKey = "MaxRange"; public static final String PrecisionKey = "Precision"; public static final String TeamKey = "Team"; public static final String IPAddressKey = "IPAddress"; public static final String PercentKey = "Percent"; public static final String IDKey = "ID"; public static final String MissionIDKey = "MissionID"; public static final String MissionDetailIDKey = "MissionDetailID"; public static final String SaltKey = "Salt"; public static final String WeightKey = "Weight"; public static final String DeviationWeightKey = "DeviationWeight"; public static final String MaterialTitleKey = "MaterialTitle"; public static final String RecipeIDKey = "RecipeID"; public static final String LastHeartBeatKey = "LastHeartBeat"; public static final String StatusKey = "Status"; public static final String StatusTitleKey = "StatusTitle"; public static final String MissionetailKey = "Missionetail"; private static final String SCALES = "/SCALES"; private static final String TASKS = "/tasks"; private String URL_MULTIPLE_UPDATE_FORMULA; private boolean isFlag; private HashMap<String, HeartbeatMutiple> mMutipleHashMap; private ChangeMultiState mChangeMultiState; private UpdateMulti mUpdateMultiFormula; private DecimalFormat mDecimalFormat; public static FormulaMutilHttpManager getInstance(Context context) { if (mInstance == null) { synchronized (FormulaMutilHttpManager.class) { if (mInstance == null) { mInstance = new FormulaMutilHttpManager(context); } } } return mInstance; } public FormulaMutilHttpManager(Context context) { super(); mContext = context; initVarible(); } private void initVarible() { mMutipleHashMap = new HashMap<String, HeartbeatMutiple>(); isFlag = true; } /** * 销毁实例 */ public void destroyInstance() { mInstance = null; mMutipleHashMap = null; } /** * 发送心跳包 * * @param model 设备名必须传 Device * @param listener 成功失败超时接口 * @param context */ public void sendHeartbeatPackets(FormulaRegisterModel model, final FormulaOkHttpListener<FormulaMulitTasks> listener, Context context) { if (mMutipleHashMap != null) { if (model != null) { HeartbeatMutiple heartbeatMutiple; if (mMutipleHashMap.containsKey(model.getDevice())) { heartbeatMutiple = mMutipleHashMap.get(model.getDevice()); } else { heartbeatMutiple = new HeartbeatMutiple(model, listener, context, 10, 3); mMutipleHashMap.put(model.getDevice(), heartbeatMutiple); } if (heartbeatMutiple != null) { if (!heartbeatMutiple.isAlive()) heartbeatMutiple.start(); } } } } /** * 关闭心跳发送 */ public void closeHeartbeatPackets(String deviceID) { if (!TextUtils.isEmpty(deviceID)) { if (mMutipleHashMap != null) { HeartbeatMutiple heartbeatMutiple = mMutipleHashMap.get(deviceID); if (heartbeatMutiple != null) { heartbeatMutiple.unRegistHeartbeat(); mMutipleHashMap.remove(deviceID); heartbeatMutiple = null; } } } } private class HeartbeatMutiple extends Thread { private OkHttpClient mOkHttpClient; private FormulaRegisterModel mModel; private FormulaOkHttpListener<FormulaMulitTasks> mListener; private Context mContext; private boolean isSafety; private int OktimeOut;// ok超时时间 private int heartbeatTime;// 隔几秒发送 HeartbeatMutiple(FormulaRegisterModel model, final FormulaOkHttpListener<FormulaMulitTasks> listener, Context context, int oktimeOut, int heartbeatTime) { mModel = model; mListener = listener; mContext = context; mOkHttpClient = new OkHttpClient(); //设置OK超时 isSafety = true; OktimeOut = oktimeOut; mOkHttpClient.setConnectTimeout(OktimeOut, TimeUnit.SECONDS); this.heartbeatTime = heartbeatTime; } @Override public void run() { while (isSafety) { registHeartbeat(mModel, mListener, mContext); try { Thread.sleep(heartbeatTime * 1000); } catch (InterruptedException e) { e.printStackTrace(); } } } private void registHeartbeat(FormulaRegisterModel model, final FormulaOkHttpListener<FormulaMulitTasks> listener, Context context) { if (context == null) { listener.onError(null, null); return; } String handlerValue = getLocationToken(context); if (TextUtils.isEmpty(handlerValue)) { listener.onError(null, null); return; }// mUpLoadMultipleArrayList = new OkHttpClient(); if (model == null) return; RequestBody build = new FormEncodingBuilder() .add(FormulaMutilHttpManager.DeviceKey, model.getDevice())// .add(FormulaMultipleManager.TitleKey, model.getTitle())// .add(FormulaMultipleManager.MaxRangeKey, String.valueOf(model.getMaxRange()))// .add(FormulaMultipleManager.TeamKey, model.getTeam())// .add(FormulaMultipleManager.IPAddressKey, model.getIPAddress())// .add(FormulaMultipleManager.PercentKey, String.valueOf(model.getPercent()))// .add(FormulaMultipleManager.PrecisionKey, String.valueOf(model.getPrecision())). .build(); final Request request = new Request .Builder() .url(URL_MULTIPLE_REGISTGER_FORMULA) .addHeader(AUTHORIZATION, handlerValue) .post(build) .build(); mOkHttpClient.newCall(request) .enqueue(new Callback() { @Override public void onFailure(Request request, IOException e) { if (listener != null) listener.onError(request, e); } @Override public void onResponse(Response response) throws IOException { if (null != listener) { switch (response.code()) { case HttpURLConnection.HTTP_BAD_REQUEST: String ss = response.toString(); listener.onError(response.request(), null); break; case HttpURLConnection.HTTP_OK: Gson gson = new Gson(); String string = response.body().string(); FormulaMulitTasks result = gson.fromJson(string, new TypeToken<FormulaMulitTasks>() { }.getType()); listener.onResponse(result, null, null); break; default: listener.onError(response.request(), null); break; } } } }); } void unRegistHeartbeat() { this.interrupt(); isSafety = false; } } /** * 上传 多条 * * @param list 上传列表 * @param context 上下文 * @param listener 回调接口 * @param uploadMultipleListener 状态回调 */ public void updateMultiFormulaInfo(ArrayList<FormulaMutilInvoiceInfo> list, Context context, final FormulaOkHttpListener<String> listener, IUploadMultipleListener uploadMultipleListener) { if (mUpdateMultiFormula != null) { mUpdateMultiFormula.closeRun(); mUpdateMultiFormula = null; } if(list == null) { return; } mUpdateMultiFormula = new UpdateMulti(list, context, listener, uploadMultipleListener); if (!mUpdateMultiFormula.isAlive()) mUpdateMultiFormula.start(); } private class UpdateMulti extends Thread { private ArrayList<FormulaMutilInvoiceInfo> mList; private Context mContext; private FormulaOkHttpListener<String> mListener; private IUploadMultipleListener mUploadMultipleListener; private boolean isSafety; private LinkedBlockingDeque<FormulaMutilInvoiceInfo> mSendMsgQuene; private Call mCall; private OkHttpClient mOkHttpClient; private ArrayList<FormulaMutilInvoiceInfo> mUpLoadMultipleArrayList; private ArrayList<FormulaMulitTasks> successList; private ArrayList<Integer> errorList; UpdateMulti(ArrayList<FormulaMutilInvoiceInfo> list, Context context, final FormulaOkHttpListener<String> listener, IUploadMultipleListener uploadMultipleListener) {// mList = list; mDecimalFormat = new DecimalFormat(); mList = new ArrayList<FormulaMutilInvoiceInfo>(); mList.addAll(list); mContext = context; mListener = listener; mUploadMultipleListener = uploadMultipleListener; isFlag = true; isSafety = true; mSendMsgQuene = new LinkedBlockingDeque<FormulaMutilInvoiceInfo>(); mOkHttpClient = new OkHttpClient(); mUpLoadMultipleArrayList = new ArrayList<FormulaMutilInvoiceInfo>(); successList = new ArrayList<FormulaMulitTasks>(); errorList = new ArrayList<Integer>(); } @Override public void run() { super.run(); updateInfo(mList, mContext, mListener, mUploadMultipleListener); } private void closeRun() { isSafety = false; if (mList != null) mList.clear(); if (mUpLoadMultipleArrayList != null) mUpLoadMultipleArrayList.clear(); if (successList != null) successList.clear(); if (errorList != null) errorList.clear(); mList = null; mUpLoadMultipleArrayList = null; successList = null; errorList = null; mListener = null; mContext = null; mOkHttpClient = null; mDecimalFormat = null; } /** * @param list 多个配料上传list * @param context * @param listener 回调 */ void updateInfo(ArrayList<FormulaMutilInvoiceInfo> list, Context context, final FormulaOkHttpListener<String> listener, IUploadMultipleListener uploadMultipleListener) { if(list==null) return;// ArrayList<CallbackInfo> success = {0};//200// final int[] error1 = {0};//设备ID出错 not_in_weight_or_donot_weight_anything: 未称重,或者无称重数值// final int[] error2 = {0};//未找到相应的台秤信息// final int[] fail = {0};//失败(网络异常,地址不正确,超时) for (FormulaMutilInvoiceInfo formulaUpLoadMultiple : list) { putQuene(formulaUpLoadMultiple); updateFormulaInfo(context, listener, new CallBack() { @Override public void onCallback(int start, String resualt) { switch (start) { case HttpURLConnection.HTTP_BAD_REQUEST: errorList.add(HttpURLConnection.HTTP_BAD_REQUEST); break; case HttpURLConnection.HTTP_OK: Gson gson = new Gson(); FormulaMulitTasks result = gson.fromJson(resualt, new TypeToken<FormulaMulitTasks>() { }.getType()); successList.add(result);// break; case HttpURLConnection.HTTP_NOT_FOUND: errorList.add(HttpURLConnection.HTTP_NOT_FOUND); break; case 555: errorList.add(555); break; } } }); } if (uploadMultipleListener != null) uploadMultipleListener.onStatus(successList, errorList); } private void putQuene(FormulaMutilInvoiceInfo formulaUpLoadMultiple) { isSafety = true; if (mUpLoadMultipleArrayList != null) { mUpLoadMultipleArrayList.add(formulaUpLoadMultiple); } } /** * 上传称重记录 * task 任务信息 * * @param context * @param listener 回调接口 */ private void updateFormulaInfo(Context context, final FormulaOkHttpListener<String> listener, final CallBack back) { String handlerValue = getLocationToken(context); while (isSafety) { if (mUpLoadMultipleArrayList != null) { if (mUpLoadMultipleArrayList.size() == 0) { continue; } if (!isSafety) { closeRun(); return; } FormulaMutilInvoiceInfo task = mUpLoadMultipleArrayList.get(0); mUpLoadMultipleArrayList.remove(task); if (task == null) { closeRun(); return; } if (mDecimalFormat == null) { mDecimalFormat = new DecimalFormat(); } WeightFormat.updateFormat(mDecimalFormat,task.getDecimalsNum()); RequestBody build = new FormEncodingBuilder() .add(FormulaMutilHttpManager.IDKey, task.getID()) .add(FormulaMutilHttpManager.DeviceKey, task.getDevice()) .add(FormulaMutilHttpManager.TitleKey, task.getTitle()) .add(FormulaMutilHttpManager.MaxRangeKey, String.valueOf(task.getMaxRange())) .add(FormulaMutilHttpManager.PrecisionKey, String.valueOf(task.getPrecision())) .add(FormulaMutilHttpManager.TeamKey, task.getTeam()) .add(FormulaMutilHttpManager.IPAddressKey, task.getIPAddress()) .add(FormulaMutilHttpManager.PercentKey, String.valueOf(task.getPercent())) .add(FormulaMutilHttpManager.MissionIDKey, task.getMissionID()) .add(FormulaMutilHttpManager.MissionDetailIDKey, task.getMissionDetailID()) .add(FormulaMutilHttpManager.WeightKey, mDecimalFormat.format(task.getWeight())) .add(FormulaMutilHttpManager.DeviationWeightKey, String.valueOf(task.getDeviationWeight())) .add(FormulaMutilHttpManager.SaltKey, task.getSalt()) .build(); URL_MULTIPLE_UPDATE_FORMULA = URL_MULTIPLE_REGISTGER_FORMULA + "/" + task.getID() + TASKS; final Request request = new Request .Builder() .url(URL_MULTIPLE_UPDATE_FORMULA) .addHeader(AUTHORIZATION, handlerValue) .post(build) .build(); if (mUpLoadMultipleArrayList != null) mCall = mOkHttpClient.newCall(request); mCall.enqueue(new Callback() { @Override public void onFailure(Request request, IOException e) { back.onCallback(555, e.getMessage()); listener.onError(request, e); isSafety = false; } @Override public void onResponse(Response response) throws IOException { String s = ""; if (response != null) { int code = response.code(); if (null != listener) { switch (code) { case HttpURLConnection.HTTP_BAD_REQUEST: listener.onError(response.request(), null); break; case HttpURLConnection.HTTP_OK: ResponseBody body = response.body(); if (body != null) s = body.string(); listener.onResponse(s, null, null); break; case HttpURLConnection.HTTP_NOT_FOUND: listener.onError(response.request(), null); break; default: listener.onError(response.request(), null); break; } } back.onCallback(code, s); } isSafety = false;// Back.callback(); } }); } } } } /** * 更新多台状态 * * @param list * @param context * @param listener * @param uploadMultipleListener */ public void changeMultiState(ArrayList<FormulaMulitTasks> list, Context context, final FormulaOkHttpListener<String> listener, IUploadMultipleListener uploadMultipleListener) { if (mChangeMultiState != null) { mChangeMultiState.closeRun(); mChangeMultiState = null; } if(list == null) { return; } mChangeMultiState = new ChangeMultiState(list, context, listener, uploadMultipleListener); if (!mChangeMultiState.isAlive()) mChangeMultiState.start(); } /** * */ private class ChangeMultiState extends Thread { private ArrayList<FormulaMulitTasks> mList; private Context mContext; private FormulaOkHttpListener<String> mListener; private IUploadMultipleListener mUploadMultipleListener; private boolean isSafety; private LinkedBlockingDeque<FormulaMulitTasks> mSendMsgQuene; private Call mCall; private OkHttpClient mOkHttpClient; private ArrayList<FormulaMulitTasks> mUpLoadMultipleArrayList; private ArrayList<FormulaMulitTasks> successList; private ArrayList<Integer> errorList; /** * @param list * @param context * @param listener * @param uploadMultipleListener */ ChangeMultiState(ArrayList<FormulaMulitTasks> list, Context context, final FormulaOkHttpListener<String> listener, IUploadMultipleListener uploadMultipleListener) {// mList = list; mList = new ArrayList<FormulaMulitTasks>(); mList.addAll(list); mContext = context; mListener = listener; mUploadMultipleListener = uploadMultipleListener; isFlag = true; isSafety = true; mSendMsgQuene = new LinkedBlockingDeque<FormulaMulitTasks>(); mOkHttpClient = new OkHttpClient(); mUpLoadMultipleArrayList = new ArrayList<FormulaMulitTasks>(); successList = new ArrayList<FormulaMulitTasks>(); errorList = new ArrayList<Integer>(); } @Override public void run() { super.run(); try { updateChangeInfo(mList, mContext, mListener, mUploadMultipleListener); } catch (Exception e) { e.printStackTrace(); } } private void closeRun() { isSafety = false; if (mList != null) mList.clear(); if (mUpLoadMultipleArrayList != null) mUpLoadMultipleArrayList.clear(); if (successList != null) successList.clear(); if (errorList != null) errorList.clear(); mList = null; mUpLoadMultipleArrayList = null; successList = null; errorList = null; mListener = null; mContext = null; mOkHttpClient = null; } /** * @param list 多个配料上传list * @param context * @param listener 回调 */ void updateChangeInfo(ArrayList<FormulaMulitTasks> list, Context context, final FormulaOkHttpListener<String> listener, IUploadMultipleListener uploadMultipleListener) { for (FormulaMulitTasks formulaUpLoadMultiple : list) { putQuene(formulaUpLoadMultiple); updateStateFormulaInfo(context, listener, new CallBack() { @Override public void onCallback(int start, String resualt) { switch (start) { case HttpURLConnection.HTTP_BAD_REQUEST:// errorList.add(HttpURLConnection.HTTP_BAD_REQUEST); break; case HttpURLConnection.HTTP_OK: Gson gson = new Gson(); FormulaMulitTasks result = gson.fromJson(resualt, new TypeToken<FormulaMulitTasks>() { }.getType());// successList.add(result);// break; case HttpURLConnection.HTTP_NOT_FOUND:// errorList.add(HttpURLConnection.HTTP_NOT_FOUND); break; case 555:// errorList.add(555); break; } } }); } if (uploadMultipleListener != null) uploadMultipleListener.onStatus(successList, errorList); } private void putQuene(FormulaMulitTasks formulaUpLoadMultiple) { isSafety = true; if (mUpLoadMultipleArrayList != null) { mUpLoadMultipleArrayList.add(formulaUpLoadMultiple); } } /** * 改变状态方法 * task 任务信息 * * @param context * @param listener 回调接口 */ private void updateStateFormulaInfo(Context context, final FormulaOkHttpListener<String> listener, final CallBack back) { String handlerValue = getLocationToken(context); while (isSafety) { if (mUpLoadMultipleArrayList != null) { if (mUpLoadMultipleArrayList.size() == 0) { continue; } if (!isSafety) { closeRun(); return; } FormulaMulitTasks task = mUpLoadMultipleArrayList.get(0); mUpLoadMultipleArrayList.remove(task); if (task == null) { closeRun(); return; } RequestBody build = new FormEncodingBuilder() .add(FormulaMutilHttpManager.IDKey, task.getID()) .add(FormulaMutilHttpManager.DeviceKey, task.getDevice()) .add(FormulaMutilHttpManager.TitleKey, task.getTitle()) .add(FormulaMutilHttpManager.MaxRangeKey, String.valueOf(task.getMaxRange())) .add(FormulaMutilHttpManager.PrecisionKey, String.valueOf(task.getPrecision())) .add(FormulaMutilHttpManager.TeamKey, task.getTeam()) .add(FormulaMutilHttpManager.IPAddressKey, task.getIPAddress()) .add(FormulaMutilHttpManager.PercentKey, String.valueOf(task.getPercent())) .add(FormulaMutilHttpManager.MissionIDKey, task.getMissionID()) .add(FormulaMutilHttpManager.MissionDetailIDKey, task.getMissionDetailID()) .add(FormulaMutilHttpManager.WeightKey, String.valueOf(task.getWeight())) .add(FormulaMutilHttpManager.DeviationWeightKey, String.valueOf(task.getDeviationWeight())) .add(FormulaMutilHttpManager.MaterialTitleKey, task.getMaterialTitle()) .add(FormulaMutilHttpManager.RecipeIDKey, task.getRecipeID()) .add(FormulaMutilHttpManager.LastHeartBeatKey, task.getLastHeartBeat()) .add(FormulaMutilHttpManager.StatusKey, String.valueOf(task.getStatus())) .add(FormulaMutilHttpManager.StatusTitleKey, task.getStatusTitle()) .add(FormulaMutilHttpManager.MissionetailKey, task.getMissionDetail() + "") .add(FormulaMutilHttpManager.SaltKey, task.getSalt()) .build(); URL_MULTIPLE_UPDATE_FORMULA = URL_MULTIPLE_REGISTGER_FORMULA + "/" + task.getID() + TASKS; final Request request = new Request .Builder() .url(URL_MULTIPLE_UPDATE_FORMULA) .addHeader(AUTHORIZATION, handlerValue) .post(build) .build(); if (mUpLoadMultipleArrayList != null) mCall = mOkHttpClient.newCall(request); mCall.enqueue(new Callback() { @Override public void onFailure(Request request, IOException e) {// if(e.getCause().equals(SocketTimeoutException.class))//如果超时 back.onCallback(555, e.getMessage()); listener.onError(request, e);// Back.callback(); isSafety = false; } @Override public void onResponse(Response response) throws IOException { String s = ""; Globals.log("sendHeartForFormulaMutil 5"+response); if (response != null) { int code = response.code(); if (null != listener) { switch (code) { case HttpURLConnection.HTTP_BAD_REQUEST: listener.onError(response.request(), null); break; case HttpURLConnection.HTTP_OK: ResponseBody body = response.body(); if (body != null) s = body.string(); listener.onResponse(s, null, null); break; case HttpURLConnection.HTTP_NOT_FOUND: listener.onError(response.request(), null); break; default: listener.onError(response.request(), null); break; } } back.onCallback(code, s); } isSafety = false; } }); Globals.log("0 registerDeviceInfoListen 结束"); } } Globals.log("1 registerDeviceInfoListen 结束"); } } public interface CallBack { void onCallback(int start, String result); }}
接口
/** * Created by lihengwei on 2016/3/31. */public abstract class FormulaOkHttpListener<T>{ public void onError(Request request, Exception e) { // TODO: 2016/3/31// 对一些系统错误进行统一操作,并释放接口 onResponse(null, request, e); } public abstract void onResponse(T response, Request request, Exception e);}
阅读全文
0 0
- 基于OKhttp循环队列发送心跳包,上传,多条上传 管理类
- 基于OKhttp循环队列发送心跳包,上传,多条上传 管理类
- okhttp多图上传
- okhttp上传
- Okhttp上传
- OkHttp文件上传及管理之初步实现
- android 使用OkHttp上传多张图片
- android 使用OkHttp上传多张图片
- android 使用OkHttp上传多张图片
- okhttp上传多张图片核心代码
- Android OkHttp 结合php 多图片上传
- Okhttp之上传头像和封装类
- OkHttp上传Json数据
- okhttp上传文件实例
- okhttp上传文件
- okhttp-上传文件
- Android okHttp图片上传
- 使用Okhttp上传图片
- 简单网页计算器代码
- N
- 数据语言和约束
- Oracle数据库安装过程中先决检查条件失败
- 框架整合搭建实战练习记录2
- 基于OKhttp循环队列发送心跳包,上传,多条上传 管理类
- Spring mvc批量图片上传
- autopilot 源代码
- Pointfree 编程风格
- Servlet.service() for servlet [spring] in context with path [/]
- IE6下图片的浏览剪裁与上传
- 使用ZooKeeper实现队列
- 斯坦福大学公开课IOS 7学习笔记 (1)
- 文件及数据流技术(五)