lizhanwei
2020-01-21 aff3ecab64dd259fdbbf8382dc02325b46d7b4d1
修改地图为单线程绘制,收到的数据放入队列
1个文件已修改
236 ■■■■■ 已修改文件
app/src/main/java/safeluck/drive/evaluation/fragment/MapFragment.java 236 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/fragment/MapFragment.java
@@ -6,8 +6,8 @@
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.SurfaceHolder;
@@ -15,7 +15,6 @@
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -27,11 +26,11 @@
import com.google.gson.reflect.TypeToken;
import org.json.JSONException;
import org.json.JSONObject;
import java.lang.reflect.Type;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import me.yokeyword.fragmentation.SupportFragment;
import safeluck.drive.evaluation.Constant;
@@ -40,7 +39,6 @@
import safeluck.drive.evaluation.bean.RealTimeCarPos;
import safeluck.drive.evaluation.cEventCenter.CEventCenter;
import safeluck.drive.evaluation.cEventCenter.ICEventListener;
import safeluck.drive.evaluation.util.CThreadPoolExecutor;
import safeluck.drive.evaluation.util.FileUtil;
@@ -80,6 +78,9 @@
            , {9.278, -1.5330000000000004}, {9.277999999999999, 1.467000000000001}};
    Gson gson;
    private LinearLayout linearLayout;//surfaceview的父容器,为了移动surfaceview而使用,因为scrollto不能移动view,
    private LinkedBlockingQueue queue = new LinkedBlockingQueue(100);
    private ExecutorService producer = Executors.newSingleThreadExecutor();
    private ExecutorService consumer = Executors.newSingleThreadExecutor();
    @Nullable
@@ -88,6 +89,7 @@
        View view = inflater.inflate(R.layout.layout_mapfragment, container, false);
        gson = new Gson();
        initView(view);
        consumer.execute(new CalRunnable());
        return view;
    }
@@ -282,12 +284,12 @@
                    pathText.lineTo(700, 30);
                    canvas2.drawTextOnPath(osd2, pathText, 0, 0, paint);//逆时针生成
                }
                if (osd3 != null) {
                    Path pathText = new Path();
                    pathText.moveTo(10, 240);
                    pathText.lineTo(700, 130);
                    canvas2.drawTextOnPath(osd2, pathText, 0, 0, paint);//逆时针生成
                }
//                if (osd3 != null) {
//                    Path pathText = new Path();
//                    pathText.moveTo(10, 240);
//                    pathText.lineTo(700, 130);
//                    canvas2.drawTextOnPath(osd2, pathText, 0, 0, paint);//逆时针生成
//                }
                // 提交画布
                Canvas canvas = holder.lockCanvas();
@@ -329,83 +331,116 @@
    int line = 0;
    int map_line = 0;
    private StringBuffer stringBuffer = new StringBuffer();
    class MessageRemoteService{
        public int msgCode;
        public String json;
        public MessageRemoteService(int msgCode, Object obj) {
            this.json = (String) obj;
            this.msgCode = msgCode;
        }
    }
    private ICEventListener icEventListener = new ICEventListener() {
        @Override
        public void onCEvent(String topic, int msgCode, int resultCode, Object obj) {
        public void onCEvent(String topic, final int msgCode, int resultCode, final Object obj) {
            CThreadPoolExecutor.runInBackground(new CalRunnable(msgCode,(String)obj));
//            CThreadPoolExecutor.runInBackground(new CalRunnable(msgCode,(String)obj));
            producer.execute(new Runnable() {
                @Override
                public void run() {
                    queue.offer(new MessageRemoteService(msgCode,obj));
                }
            });
        }
    };
    boolean flag = true;
    class CalRunnable implements Runnable{
        private String json;
        private int cmd;
        public CalRunnable(int cmd,String obj) {
           this.json = obj;
           this.cmd = cmd;
        }
//        public CalRunnable(int cmd,String obj) {
//           this.json = obj;
//           this.cmd = cmd;
//        }
        @Override
        public void run() {
            MyLog.i(TAG, json);
            if (!(cmd == Constant.REAL_TIME_CAR_POS)){
                if (cmd == Constant.DEBUG_RTCM){
                    stringBuffer.append("\tRTCM:");
            while (flag){
                MessageRemoteService messageRemoteService = (MessageRemoteService) queue.peek();
                if (messageRemoteService == null){
                    try {
                        JSONObject jsonObject = new JSONObject(json);
                        int length = jsonObject.getInt("length");
                        stringBuffer.append(length);
                    } catch (JSONException e) {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                if (cmd == Constant.DEBUG_TXT){
                    try {
                        JSONObject jsonObject = new JSONObject(json);
                        String info = jsonObject.getString("info");
                        stringBuffer.append("\tinfo:");
                        stringBuffer.append(info);
                    } catch (JSONException e) {
                        e.printStackTrace();
                messageRemoteService = (MessageRemoteService) queue.poll();
                if (messageRemoteService != null){
                    this.cmd = messageRemoteService.msgCode;
                    this.json = messageRemoteService.json;
                    MyLog.i(TAG, json);
//            if (!(cmd == Constant.REAL_TIME_CAR_POS)){
//                if (cmd == Constant.DEBUG_RTCM){
//                    stringBuffer.append("\tRTCM:");
//                    try {
//                        JSONObject jsonObject = new JSONObject(json);
//                        int length = jsonObject.getInt("length");
//                        stringBuffer.append(length);
//                    } catch (JSONException e) {
//                        e.printStackTrace();
//                    }
//                }
//                if (cmd == Constant.DEBUG_TXT){
//                    try {
//                        JSONObject jsonObject = new JSONObject(json);
//                        String info = jsonObject.getString("info");
//                        stringBuffer.append("\tinfo:");
//                        stringBuffer.append(info);
//                    } catch (JSONException e) {
//                        e.printStackTrace();
//                    }
//
//                }
//            }
//            osd3 = stringBuffer.toString();
//            if (osd3!=null && osd3.contains("info:")&&osd3.contains("RTCM:")){
//
//                stringBuffer.delete(0,stringBuffer.length());
//            }
                    RealTimeCarPos timeCarPos = gson.fromJson((String) json, RealTimeCarPos.class);
                    List<Double> points = timeCarPos.getPoint();
                    switch (timeCarPos.getMove()){
                        case 0:
                            osd2 = "停车";
                            break;
                        case 1:
                            osd2 = "前进";
                            break;
                        case -1:
                            osd2 = "后退";
                            break;
                    }
                    osd="方向角"+String.valueOf(timeCarPos.getHeading());
                    line = 0;
                    map_line = 0;
                }
            }
            osd3 = stringBuffer.toString();
            if (osd3!=null && osd3.contains("info:")&&osd3.contains("RTCM:")){
                    for (int i = 0; i < points.size(); i++) {
                        if ((i % 2) == 0) {
                            car[line][0] = points.get(i);
                        } else {
                            double value = 0 - points.get(i);
                            Log.i(TAG, "onCEvent: 新值=" + value + " 位置:" + i);
                            car[line][1] = value;
                            line++;
                        }
                stringBuffer.delete(0,stringBuffer.length());
            }
            RealTimeCarPos timeCarPos = gson.fromJson((String) json, RealTimeCarPos.class);
            List<Double> points = timeCarPos.getPoint();
            switch (timeCarPos.getMove()){
                case 0:
                    osd2 = "停车";
                    break;
                case 1:
                    osd2 = "前进";
                    break;
                case -1:
                    osd2 = "后退";
                    break;
            }
            osd="方向角"+String.valueOf(timeCarPos.getHeading());
            line = 0;
            map_line = 0;
            for (int i = 0; i < points.size(); i++) {
                if ((i % 2) == 0) {
                    car[line][0] = points.get(i);
                } else {
                    double value = 0 - points.get(i);
                    Log.i(TAG, "onCEvent: 新值=" + value + " 位置:" + i);
                    car[line][1] = value;
                    line++;
                }
            }
            map_id = timeCarPos.getMap_id();
                    }
                    map_id = timeCarPos.getMap_id();
//            1 - 倒库
//            2 - 坡起
//            3 - 侧方停车
@@ -413,45 +448,49 @@
//            5 - 直角转弯
            StringBuffer buffer = FileUtil.readTxtFileFromSD(_mActivity,Constant.MAP);
            Type type = new TypeToken<List<ExamMap>>(){}.getType();
            if (buffer != null){
                List<ExamMap> examMaps = gson.fromJson(buffer.toString().trim(), type);
                    StringBuffer buffer = FileUtil.readTxtFileFromSD(_mActivity,Constant.MAP);
                    Type type = new TypeToken<List<ExamMap>>(){}.getType();
                    if (buffer != null){
                        List<ExamMap> examMaps = gson.fromJson(buffer.toString().trim(), type);
                for (int i = 0; i < examMaps.size(); i++) {
                    ExamMap examMap = examMaps.get(i);
                    if (map_id == examMap.getId()){
                        List<ExamMap.PointBean> pointBeanList = examMap.getPoint();
                        for (int i = 0; i < examMaps.size(); i++) {
                            ExamMap examMap = examMaps.get(i);
                            if (map_id == examMap.getId()){
                                List<ExamMap.PointBean> pointBeanList = examMap.getPoint();
                        for(int j=0; j<pointBeanList.size();j++){
                            List<Double> xys = pointBeanList.get(i).getXy();
                            if(j==0){
                                map = new double[xys.size()/2][2];
                            }else{
                                MyLog.i(TAG,"暂时还不支持曲线");
                                for(int j=0; j<pointBeanList.size();j++){
                                    List<Double> xys = pointBeanList.get(i).getXy();
                                    if(j==0){
                                        map = new double[xys.size()/2][2];
                                    }else{
                                        MyLog.i(TAG,"暂时还不支持曲线");
                                        break;
                                    }
                                    for (int k=0; k<xys.size();k++){
                                        if ((k % 2) == 0) {
                                            map[map_line][0] = xys.get(k);
                                        } else {
                                            double value = 0 - xys.get(k);
                                            Log.i(TAG, "onCEvent: map新值=" + value + " 位置:" + i);
                                            map[map_line][1] = value;
                                            map_line++;
                                        }
                                    }
                                }
                                break;
                            }
                            for (int k=0; k<xys.size();k++){
                                if ((k % 2) == 0) {
                                    map[map_line][0] = xys.get(k);
                                } else {
                                    double value = 0 - xys.get(k);
                                    Log.i(TAG, "onCEvent: map新值=" + value + " 位置:" + i);
                                    map[map_line][1] = value;
                                    map_line++;
                                }
                            }
                        }
                        break;
                    }
                    DrawMap(map,car);
                }
            }
            DrawMap(map,car);
        }
    }
    @Override
@@ -463,6 +502,9 @@
    @Override
    public void onDetach() {
        super.onDetach();
        flag = false;
        producer.shutdown();
        consumer.shutdown();
        CEventCenter.onBindEvent(false, icEventListener, Constant.REAL_TIME_POS_CAR_TOPIC);
    }
}