1. 程式人生 > >bug:搜出來的燈會出現一個圖示能控多個燈

bug:搜出來的燈會出現一個圖示能控多個燈

描述

預置條件:30顆未新增的燈
操作步驟:分6次新增,每次新增5個
預期結果:新增成功,並且顯示序號正常
實際結果:1、上一輪加的燈有閃爍,但是APP未顯示
2、重新搜尋出現的燈4正常排序後,能控制之前閃爍無顯示的燈

原因分析:在給燈分配meshid的時候,在最後時刻成功了,但是已經搜尋結果頁面已經顯示失敗了,所以下次搜尋的時候還是用上次的meshid,導致一個meshid分配到兩個燈上,一個顯示成功,一個新增成功但未顯示。所以開關那個顯示成功的燈的時候,傳送的給同一個meshid,導致能出現控制兩個燈。

解決方案,新增一個黑名單機制,在分配meshid的時候把meshid放進黑名單,等到裝置新增完成了,再從黑名單中踢出新增成功的meshid,如果出現意外,在裝置上報的時候對比裝置列表中有沒有上報的資料,如果沒有的話 踢出不存在裝置列表的資料,並將黑名單對應的meshid資料刪除。

第一步在deviceMange中新增 

addBlackDevice 
deleteBlackDevice
queryBlackDevice
queryBlackDeviceBoolean 四個方法
//新增黑名單裝置
    public void addBlackDevice(int nextMeshId) {
        if (blackList.contains((Integer) nextMeshId))
        {
            return;
        }
        blackList.add(nextMeshId);
        Log.e("blackList", "addBlackDevice nextMeshId:"+ nextMeshId);
    }
    //移除黑名單裝置
    public void deleteBlackDevice(int nextMeshId) {
        for(int i = 0 ;i<blackList.size();i++){
            if( nextMeshId==blackList.get(i)){
                blackList.remove(i);
            }
        }
        Log.e("blackList", "deleteBlackDevice nextMeshId:"+ nextMeshId);
    }
    //從黑名單判斷id是否存在 存在返回id+1
    public int queryBlackDevice(int nextMeshId) {
        Log.e("blackList", "queryBlackDevice nextMeshId:"+ nextMeshId);
        Log.e("blackList", "queryBlackDevice blackList:"+ blackList+" blackList.size:"+ blackList.size());
        while(queryBlackDeviceBoolean(nextMeshId)){
            nextMeshId = getNextMeshId(nextMeshId + 1);
        }
        return nextMeshId;
    }
    //從黑名單判斷id是否存在 存在返回true
    public Boolean queryBlackDeviceBoolean(int nextMeshId) {
        Log.e("blackList", "queryBlackDeviceBoolean nextMeshId:"+ nextMeshId);
        if (blackList.isEmpty()) return false;
        for(int i = 0 ;i<blackList.size();i++){
            if( nextMeshId==blackList.get(i)){
                return true;
            }else{
                return false;
            }
        }
        return false;
    }

第二步 在addDeviceFragment中分配meshid  判斷是否分配失敗重試,如果沒有的話就查詢meshid是否在黑名單中,如果沒有就新增到黑名單中,並將新的meshid儲存到鍵值對中

    if(failTime <= 0 || TextUtils.isEmpty(macAddress)){
            Log.e("blackList", " failTime:"+ failTime+"macAddress"+macAddress);
            nextMeshId = DeviceMange.getInstance().getNextMeshId(nextMeshId);
            Log.e("blackList", "1 nextMeshId:"+ nextMeshId);
//            獲取meshId是否存在於黑名單中
            nextMeshId = DeviceMange.getInstance().queryBlackDevice(nextMeshId);
            Log.e("blackList", "2 nextMeshId:"+ nextMeshId);
//            新增meshId到黑名單中
            DeviceMange.getInstance().addBlackDevice(nextMeshId);
            SharedPreferencesUtil.keepShared(Constant.DEVICE_ID_RECORD, nextMeshId);//將非黑名單的meshId儲存到DEVICE_ID_RECORD
        }
    if(failTime>=2){
                DeviceMange.getInstance().deleteBlackDevice(nextMeshId);
            SharedPreferencesUtil.keepShared(Constant.DEVICE_ID_RECORD, nextMeshId-1);//將   非黑名單的meshId儲存到DEVICE_ID_RECORD
        }

第三步 在addDeviceFragment中新增裝置成功將meshid從黑名單移除

int nextMeshId = SharedPreferencesUtil.queryIntValue(Constant.DEVICE_ID_RECORD) ;
                    SharedPreferencesUtil.keepShared(Constant.DEVICE_ID_RECORD, meshAddress);//儲存meshID最後的記錄
                    //TODO:2
                    Log.e("blackList", "3 meshAddress:" +meshAddress);
                    Log.e("blackList", "4 nextMeshId:"+ nextMeshId);
                    DeviceMange.getInstance().deleteBlackDevice(nextMeshId);

第四步 在TelinkLightService中收到裝置上報指令0xDC對比裝置列表中有沒有該裝置,沒有的話就踢出裝置並將黑名單中裝置移除

if (opcode == 0xDC) {
            int device1 = data[10] & 0xFF;
            int device2 = data[14] & 0xFF;
            Log.e("weichongbin3","device1 = " +device1+"device2="+device2);
            if(device1 > 0){
                Device device = DeviceMange.getInstance().getDeviceByMesh(device1);
                if(device == null){// 不存在該裝置,需從mesh中刪除
                    CtrlDeviceHandler.kickOut(device1);
                }
            }

            if(device2 > 0){
                Device device = DeviceMange.getInstance().getDeviceByMesh(device2);
                if(device == null){// 不存在該裝置,需從mesh中刪除
                    CtrlDeviceHandler.kickOut(device2);
                }
            }

            //收到推送時候清除黑名單
            ArrayList blackList = DeviceMange.getInstance().getBlackList();
            blackList.clear();
        }