yy1717
2020-01-06 f94146b3af6cf8a83c8c0ba62f7f86bae500dec2
Merge branch 'master' of https://gitee.com/endian11/DriveJudge
6个文件已修改
3个文件已添加
344 ■■■■■ 已修改文件
app/src/main/java/safeluck/drive/evaluation/app.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/cEventCenter/CEventCenter.java 202 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/cEventCenter/CEventObjPool.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/cEventCenter/ICEventListener.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/cEventCenter/ObjectPool.java 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/fragment/NetWorkTrainFragment.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/fragment/TrainFragment.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/layout_train_exit.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/java/com/anyun/exam/lib/SvrManager.java 10 ●●●●● 补丁 | 查看 | 原始文档 | 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) {