app/src/main/java/safeluck/drive/evaluation/app.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/safeluck/drive/evaluation/cEventCenter/CEventCenter.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/safeluck/drive/evaluation/cEventCenter/CEventObjPool.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/safeluck/drive/evaluation/cEventCenter/ICEventListener.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/safeluck/drive/evaluation/cEventCenter/ObjectPool.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/safeluck/drive/evaluation/fragment/NetWorkTrainFragment.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/safeluck/drive/evaluation/fragment/TrainFragment.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/res/layout/layout_train_exit.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
lib/src/main/java/com/anyun/exam/lib/SvrManager.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
app/src/main/java/safeluck/drive/evaluation/app.java
@@ -15,6 +15,7 @@ import com.anyun.exam.lib.crash.CrashHandler; import com.facebook.stetho.Stetho; import safeluck.drive.evaluation.cEventCenter.CEventCenter; import safeluck.drive.evaluation.util.SystemUtil; /** @@ -68,6 +69,7 @@ @Override public void callBackMsg(String json) { MyLog.d(TAG, "收到==" + json); CEventCenter.dispatchEvent("train",0,0,json); } app/src/main/java/safeluck/drive/evaluation/cEventCenter/CEventCenter.java
New file @@ -0,0 +1,202 @@ package safeluck.drive.evaluation.cEventCenter; import android.text.TextUtils; import android.util.Log; import java.util.HashMap; import java.util.LinkedList; import java.util.List; /** * MyApplication2 * Created by lzw on 2020/1/2. 14:03:04 * 邮箱:632393724@qq.com * All Rights Saved! Chongqing AnYun Tech co. LTD */ public class CEventCenter { private static final String TAG = CEventCenter.class.getSimpleName(); /** * 监听器列表,支持一对多存储 */ private static final HashMap<String , Object> LISTENER_MAP = new HashMap<>(); /** * 监听器列表锁 */ private static final Object LISTENER_LOCK = new Object(); /** * 事件对象池 */ private static final CEventObjPool POOL = new CEventObjPool(5); /** * 注册/注销监听器 * @param toBind true注册 false注销 * @param listener 监听器 * @param topic 单个主题 */ public static void onBindEvent(boolean toBind,ICEventListener listener,String topic){ onBindEvent(toBind,listener,new String[]{topic}); } /** * * @param toBind * @param listener * @param topics 多个主题 */ public static void onBindEvent(boolean toBind,ICEventListener listener,String[] topics){ if (toBind){ registerEventListener(listener, topics); }else{ unregisterEventListener(listener, topics); } } /** * 注册监听器 * @param listener * @param topic 单个主题 */ public static void registerEventListener(ICEventListener listener, String topic){ registerEventListener(listener,new String[]{topic}); } /** * 注销监听器 * @param listener * @param topic 单个个主题 */ private static void unregisterEventListener(ICEventListener listener, String topic) { unregisterEventListener(listener,new String[]{topic}); } /** * 注销监听器 * @param listener * @param topics 多个主题 */ private static void unregisterEventListener(ICEventListener listener, String[] topics) { if (null == listener || null == topics){ return; } synchronized (LISTENER_LOCK){ for (String topic : topics) { if (TextUtils.isEmpty(topic)) { continue; } Object obj = LISTENER_MAP.get(topic); if (null == obj){ continue; }else if (obj instanceof ICEventListener){ //有一个监听器 if (obj == listener){ LISTENER_MAP.remove(topic); } }else if (obj instanceof List){ //有多个监听器 LinkedList<ICEventListener> listeners = (LinkedList<ICEventListener>)obj; listeners.remove(listener); } } } } /** * 注册监听器 * @param listener * @param topics 多个主题 */ private static void registerEventListener(ICEventListener listener, String[] topics) { if (null == listener || null == topics){ return; } synchronized (LISTENER_LOCK){ for (String topic : topics) { if (TextUtils.isEmpty(topic)){ continue; } Object obj = LISTENER_MAP.get(topic); if (null == obj){ //还没有监听器,直接放到Map集合 LISTENER_MAP.put(topic,listener); }else if (obj instanceof ICEventListener){ //有一个监听器 ICEventListener oldListener = (ICEventListener)obj; if (listener == oldListener){ //去重 continue; } LinkedList<ICEventListener> list = new LinkedList<>(); list.add(oldListener); list.add(listener); LISTENER_MAP.put(topic,list); }else if (obj instanceof List){ //有多个监听器 LinkedList<ICEventListener> listeners = (LinkedList<ICEventListener>)obj; if (listeners.indexOf(listener) >=0){ //去重 continue; } listeners.add(listener); } } } } public static void dispatchEvent(String topic, int msgCode, int resultCode, Object object){ if (!TextUtils.isEmpty(topic)){ CEvent event = POOL.get(); event.setMsgCode(msgCode); event.setTopic(topic); event.setResultCode(resultCode); event.setObj(object); dispatchEvent(event); } } private static void dispatchEvent(CEvent event){ if (LISTENER_MAP.size() == 0){ return; } if (null != event && !TextUtils.isEmpty(event.getTopic())){ String topic = event.getTopic(); //通知事件监听器处理事件 ICEventListener listener = null; LinkedList<ICEventListener> listeners = null; synchronized (LISTENER_LOCK){ Log.d(TAG, "dispatchEvent | topic="+topic+"\tmsgCode="+event.getMsgCode()+"\tresultCode="+event.getResultCode() +"\tobj="+event.getObj()); Object obj = LISTENER_MAP.get(topic); if (obj == null){ return; } if (obj instanceof ICEventListener){ listener = (ICEventListener)obj; }else if (obj instanceof List){ listeners = (LinkedList<ICEventListener>)((LinkedList)obj).clone(); } } if (null != listener){ listener.onCEvent(topic,event.getMsgCode(),event.getResultCode(),event.getObj()); }else if (null != listeners && listeners.size()>0){ for (ICEventListener l: listeners) { l.onCEvent(topic, event.getMsgCode(), event.getResultCode(), event.getObj()); } } //把对象放回池里 POOL.returnObj(event); } } } app/src/main/java/safeluck/drive/evaluation/cEventCenter/CEventObjPool.java
New file @@ -0,0 +1,25 @@ package safeluck.drive.evaluation.cEventCenter; /** * 事件对象池 * MyApplication2 * Created by lzw on 2020/1/2. 13:58:00 * 邮箱:632393724@qq.com * All Rights Saved! Chongqing AnYun Tech co. LTD */ public class CEventObjPool extends ObjectPool<CEvent>{ public CEventObjPool(int capacity) { super(capacity); } @Override protected CEvent[] createObjPool(int capacity) { return new CEvent[capacity]; } @Override protected CEvent createNewObj() { return new CEvent(); } } app/src/main/java/safeluck/drive/evaluation/cEventCenter/ICEventListener.java
New file @@ -0,0 +1,23 @@ package safeluck.drive.evaluation.cEventCenter; /** * 事件监听器 * MyApplication2 * Created by lzw on 2020/1/2. 14:00:14 * 邮箱:632393724@qq.com * All Rights Saved! Chongqing AnYun Tech co. LTD */ public interface ICEventListener { /** * 事件回调函数 * * 如果obj使用了对象池 * 那么事件完成后,obj即自动会受到对象池,请不要再其他线程继续使用,否则可能会导致数据不正常 * @param topic * @param msgCode * @param resultCode * @param obj */ void onCEvent(String topic, int msgCode, int resultCode, Object obj); } app/src/main/java/safeluck/drive/evaluation/cEventCenter/ObjectPool.java
@@ -8,12 +8,20 @@ * All Rights Saved! Chongqing AnYun Tech co. LTD */ public abstract class ObjectPool<T extends PooledObject> { /** * 对象容器 */ private T[] mContainer; private T[] mContainer;//对象容器 /** * 对象锁 */ private final Object LOCK = new Object(); private final Object LOCK = new Object();//对象锁 private int length;//每次返回对象都放到数据末端,length表示前面可用对象数 /*** * 每次返回对象都放到数据末端,length表示前面可用对象数 */ private int length; public ObjectPool(int capacity) { mContainer = createObjPool(capacity); @@ -60,4 +68,18 @@ } return obj; } /** * 把对象放回池里面 * @param obj */ public final void returnObj(T obj){ synchronized (LOCK){ int size = mContainer.length; if (length < size){ mContainer[length] = obj; length++; } } } } app/src/main/java/safeluck/drive/evaluation/fragment/NetWorkTrainFragment.java
@@ -5,11 +5,14 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.ListView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.anyun.exam.lib.AYSdk; import java.util.ArrayList; import java.util.List; @@ -26,9 +29,10 @@ * 邮箱:632393724@qq.com * All Rights Saved! Chongqing AnYun Tech co. LTD */ public class NetWorkTrainFragment extends SupportFragment { public class NetWorkTrainFragment extends SupportFragment implements View.OnClickListener { private ListView mListView ; private Button btn_start_exam; private ScoreAdapter mScoreAdapter; private List<ScoreBean> mArrayList = new ArrayList<>(); @@ -49,6 +53,8 @@ mListView = view.findViewById(R.id.lv); mScoreAdapter = new ScoreAdapter(_mActivity); mListView.setAdapter(mScoreAdapter); btn_start_exam = view.findViewById(R.id.btn_start); btn_start_exam.setOnClickListener(this); mListView.addHeaderView(LayoutInflater.from(_mActivity).inflate(R.layout.layout_score_item,null)); mArrayList.add(new ScoreBean(12,"直角转弯","后轮胎压线")); mArrayList.add(new ScoreBean(100,"倒车入库","未系安全带")); @@ -59,4 +65,13 @@ mScoreAdapter.addDatas(mArrayList); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.btn_start: AYSdk.getInstance().at_sendCmd("AT+BEGIN_EXAM:0\r\n"); break; } } } app/src/main/java/safeluck/drive/evaluation/fragment/TrainFragment.java
@@ -1,5 +1,6 @@ package safeluck.drive.evaluation.fragment; import android.content.Context; import android.os.Bundle; import androidx.annotation.NonNull; @@ -11,10 +12,12 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.ListView; import android.widget.Toast; import java.util.ArrayList; import java.util.EventListener; import java.util.List; import me.yokeyword.fragmentation.SupportFragment; @@ -26,6 +29,8 @@ import safeluck.drive.evaluation.R; import safeluck.drive.evaluation.adapter.ScoreAdapter; import safeluck.drive.evaluation.bean.ScoreBean; import safeluck.drive.evaluation.cEventCenter.CEventCenter; import safeluck.drive.evaluation.cEventCenter.ICEventListener; /**单机训练UI * MyApplication2 @@ -37,12 +42,31 @@ private static final String TAG = TrainFragment.class.getSimpleName(); private ListView mListView ; private Button btn_train; private ScoreAdapter mScoreAdapter; private int item_id; private List<ScoreBean> mArrayList = new ArrayList<>(); private ICEventListener eventListener =new ICEventListener() { @Override public void onCEvent(String topic, int msgCode, int resultCode, Object obj) { Log.i(TAG, "onCEvent: "+(String)obj); } }; @Override public void onAttach(Context context) { super.onAttach(context); CEventCenter.onBindEvent(true, eventListener,"train"); } @Override public void onDetach() { super.onDetach(); CEventCenter.onBindEvent(false,eventListener,"train"); } public static SupportFragment newInstance(){ return new TrainFragment(); @@ -83,10 +107,15 @@ return view; } private void initView(View view) { mListView = view.findViewById(R.id.lv); view.findViewById(R.id.view_map).setOnClickListener(this); btn_train = view.findViewById(R.id.btn_start); btn_train.setOnClickListener(this); btn_train.setText("开始训练"); mScoreAdapter = new ScoreAdapter(_mActivity); mListView.setAdapter(mScoreAdapter); mListView.addHeaderView(LayoutInflater.from(_mActivity).inflate(R.layout.layout_score_item,null)); mArrayList.add(new ScoreBean(12,"直角转弯","后轮胎压线")); mArrayList.add(new ScoreBean(100,"倒车入库","未系安全带")); @@ -107,6 +136,9 @@ start(passwordFragment); } break; case R.id.btn_start: Toast.makeText(_mActivity, "开始巽寮", Toast.LENGTH_SHORT).show(); break; } } } app/src/main/res/layout/layout_train_exit.xml
@@ -23,6 +23,7 @@ android:textSize="20sp" android:layout_below="@+id/btn_return" android:padding="10dp" android:id="@+id/btn_start" android:textColor="@android:color/white" android:text="开始训练"/> android:text="开始考试"/> </RelativeLayout> lib/src/main/java/com/anyun/exam/lib/SvrManager.java
@@ -69,6 +69,16 @@ } } public void at_sendCmd(String s) { if (!checkRemoteIsNull()){ // try { // remoteInterface.at_sendCmd(s); // } catch (RemoteException e) { // e.printStackTrace(); // } } } class MyServiceConn implements ServiceConnection { @Override public void onServiceConnected(ComponentName name, IBinder service) {