解决蓝牙耳机界面内存泄露问题 1628/1
authorluozheng <1732036298@qq.com>
Mon, 13 Jan 2025 07:28:27 +0000 (15:28 +0800)
committerluozheng <1732036298@qq.com>
Mon, 13 Jan 2025 07:28:27 +0000 (15:28 +0800)
code/sdk/application/wearable/fd230app/nativeui/bluetooth/src/BluetoothDeviceCaseListAdapter.cpp

index ed75a08..dfda43d 100644 (file)
 #include "UiConfig.h"
 #include "BluetoothPresenter.h"
 
-namespace OHOS {
-BluetoothDeviceCaseListAdapter::~BluetoothDeviceCaseListAdapter()
+namespace OHOS
 {
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BluetoothDeviceCaseListAdapter::~BluetoothDeviceCaseListAdapter");
-    // UIView::OnClickListener *click = item->GetOnClickListener();
-    // if (click != nullptr) {
-    //     delete click;
-    //     click = nullptr;
-    // }
-    if (listener != nullptr) {
-        delete listener;
-        listener = nullptr;
-    }
-}
-
-uint16_t BluetoothDeviceCaseListAdapter::GetCount()
-{
-    return BluetoothModel::GetInstance()->GetConnedDevicesCase().Size();
-}
-
-class BluetoothDeviceOnClickListListener : public UIView::OnClickListener {
-public:
-    BluetoothDeviceOnClickListListener(BluetoothCaseInfo *bluetoothInfo)
-    {
-        if (bluetoothInfo != nullptr) {
-            (void)memcpy_s(addr.addr, BD_ADDR_LEN,
-                           bluetoothInfo->addr, BD_ADDR_LEN); // 源和目标内存长度一样,不做返回值判断
-            (void)memcpy_s(bluetoothInfo_.addr, BD_ADDR_LEN,
-                           bluetoothInfo->addr, BD_ADDR_LEN); // 源和目标内存长度一样,不做返回值判断
-            (void)memcpy_s(bluetoothInfo_.deviceName, BD_NAME_LEN,
-                           bluetoothInfo->deviceName, BD_NAME_LEN); // 源和目标内存长度一样,不做返回值判断
-            bluetoothInfo_.index = bluetoothInfo->index;
-            bluetoothInfo_.connIndex = bluetoothInfo->connIndex;
-        }
-    }
-    ~BluetoothDeviceOnClickListListener() {}
-    bool OnClick(UIView& view, const ClickEvent& event) override
+    class BluetoothDeviceOnClickListListener;
+    static BluetoothDeviceOnClickListListener *g_btOnClickListListener = nullptr;
+    class BluetoothDeviceOnClickListListener : public UIView::OnClickListener
     {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BluetoothDeviceOnClickListListener");
-        UNUSED(event);
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BluetoothDeviceOnClickListListener addr: %02x%02x%02x%02x%02x%02x",
-            bluetoothInfo_.addr[5], bluetoothInfo_.addr[4], bluetoothInfo_.addr[3], /* mac下标 0 1 2 3 4 5 */
-            bluetoothInfo_.addr[2], bluetoothInfo_.addr[1], bluetoothInfo_.addr[0]); /* mac下标 0 1 2 3 4 5 */
-        BluetoothModel::GetInstance()->SetTempMacValue(&bluetoothInfo_);
-        /* 点击事件 */
-        // 跳转可选页
-        if (BluetoothModel::GetInstance()->GetBluetoothCalleridStatus() == CALLERPLAYERS) {
-            JumpView *jumpView = JumpView::GetInstance();
-            if (jumpView == nullptr) {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BluetoothDeviceOnClick jumpView GetInstance fail");
-                return false;
-            }
-            jumpView->ChangeView(JumpView::BluetoothJumpViewNum::BLUETOOTHDEVICELISTVIEW,
-                                 JumpView::BluetoothJumpViewNum::BLUETOOTHEOPTIONSVIEW);
-        } else if (BluetoothModel::GetInstance()->GetBluetoothCalleridStatus() == CALLERSETTING) {
-            MainBluetoothView *mainBluetoothView = MainBluetoothView::GetInstance();
-            if (mainBluetoothView == nullptr) {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BluetoothDeviceOnClick mainBluetoothView GetInstance fail");
-                return false;
+    public:
+        BluetoothDeviceOnClickListListener() {}
+        ~BluetoothDeviceOnClickListListener() {}
+        void SetItemInfo(const BluetoothCaseInfo *bluetoothInfo)
+        {
+            if (bluetoothInfo != nullptr)
+            {
+                (void)memcpy_s(addr.addr, BD_ADDR_LEN,
+                               bluetoothInfo->addr, BD_ADDR_LEN); // 源和目标内存长度一样,不做返回值判断
+                (void)memcpy_s(bluetoothInfo_.addr, BD_ADDR_LEN,
+                               bluetoothInfo->addr, BD_ADDR_LEN); // 源和目标内存长度一样,不做返回值判断
+                (void)memcpy_s(bluetoothInfo_.deviceName, BD_NAME_LEN,
+                               bluetoothInfo->deviceName, BD_NAME_LEN); // 源和目标内存长度一样,不做返回值判断
+                bluetoothInfo_.index = bluetoothInfo->index;
+                bluetoothInfo_.connIndex = bluetoothInfo->connIndex;
             }
-            if(view.GetViewType() == UIViewType::UI_BUTTON)
+        }
+        bool OnClick(UIView &view, const ClickEvent &event) override
+        {
+            UNUSED(event);
+            BluetoothItemView *itemView = static_cast<BluetoothItemView *>(view.GetParent());
+            BluetoothCaseInfo *g_BluetoothCaseInfo = itemView->GetItemInfo();
+            SetItemInfo(g_BluetoothCaseInfo); // 保存点击的设备信息
+            BluetoothModel::GetInstance()->SetTempMacValue(&bluetoothInfo_);
+            if (BluetoothModel::GetInstance()->GetBluetoothCalleridStatus() == CALLERPLAYERS)
             {
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UIViewType::UI_BUTTON,%s",reinterpret_cast<const char *>(bluetoothInfo_.deviceName));
-                bd_addr_t *lastAddr = BluetoothModel::GetInstance()->GetLastConnedAddr();
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "lastAddr:%02X %02X %02X * * *",
-                lastAddr->addr[0],lastAddr->addr[1],lastAddr->addr[2]);
-
-                bool ret = bt_is_acl_connected(lastAddr);
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bt_is_acl_connected:%d lastAddr:%02X %02X %02X * * *",
-                ret, lastAddr->addr[0],lastAddr->addr[1],lastAddr->addr[2]);
-
-                //地址不是全0并且ret为真
-                if (!( lastAddr->addr[0] == 0 && lastAddr->addr[1] == 0 && lastAddr->addr[2] == 0 && 
-                       lastAddr->addr[3] == 0 && lastAddr->addr[4] == 0 && lastAddr->addr[5] == 0 ) && ret) {
-                    BluetoothModel::GetInstance()->SetTagConnectNew(false);
-                    errcode_t retVal = gap_disconnect_remote_device(lastAddr);
-                    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[gap_disconnect_remote_device] retVal =  %d", retVal);
-                } else {
-                    mainBluetoothView->ChangeView(BluetoothModel::GetInstance()->GetCurView(), BLUETOOTHRECONNECTVIEW);
-                    errcode_t retVal = BluetoothModel::GetInstance()->ConnectRemoteDevice(&addr);
-                    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ConnectRemoteDevice] retVal =  %d", retVal);
+                JumpView *jumpView = JumpView::GetInstance();
+                if (jumpView == nullptr)
+                {
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BluetoothDeviceOnClick jumpView GetInstance fail");
+                    return false;
                 }
+                jumpView->ChangeView(JumpView::BluetoothJumpViewNum::BLUETOOTHDEVICELISTVIEW,
+                                     JumpView::BluetoothJumpViewNum::BLUETOOTHEOPTIONSVIEW);
             }
-            else if(view.GetViewType() == UIViewType::UI_IMAGE_VIEW) /*点击的是图片*/
+            else if (BluetoothModel::GetInstance()->GetBluetoothCalleridStatus() == CALLERSETTING)
             {
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UIViewType::UI_IMAGE_VIEW");
-                mainBluetoothView->ChangeView(BluetoothModel::GetInstance()->GetCurView(), BLUETOOTHEOPTIONSVIEW);
-                BluetoothOptionsView *bluetoothOptionsView = BluetoothOptionsView::GetInstance();
-                if (bluetoothOptionsView == nullptr) {
-                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OnClick bluetoothOptionsView new fail");
+                MainBluetoothView *mainBluetoothView = MainBluetoothView::GetInstance();
+                if (mainBluetoothView == nullptr)
+                {
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BluetoothDeviceOnClick mainBluetoothView GetInstance fail");
                     return false;
                 }
-                bluetoothOptionsView->SetCurrentAddr(addr);
-                bluetoothOptionsView->RefreshText();
+                if (view.GetViewType() == UIViewType::UI_BUTTON) // 点击的是按钮
+                {
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UIViewType::UI_BUTTON,%s", reinterpret_cast<const char *>(bluetoothInfo_.deviceName));
+                    bd_addr_t *lastAddr = BluetoothModel::GetInstance()->GetLastConnedAddr();
+                    bool ret = bt_is_acl_connected(lastAddr);
+                    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "bt_is_acl_connected:%d lastAddr:%02X %02X %02X * * *",
+                                  ret, lastAddr->addr[0], lastAddr->addr[1], lastAddr->addr[2]);
+
+                    // 地址不是全0并且ret为真
+                    if (!(lastAddr->addr[0] == 0 && lastAddr->addr[1] == 0 && lastAddr->addr[2] == 0 &&
+                          lastAddr->addr[3] == 0 && lastAddr->addr[4] == 0 && lastAddr->addr[5] == 0) &&
+                        ret)
+                    {
+                        BluetoothModel::GetInstance()->SetTagConnectNew(false);
+                        errcode_t retVal = gap_disconnect_remote_device(lastAddr);
+                        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[gap_disconnect_remote_device] retVal =  %d", retVal);
+                    }
+                    else
+                    {
+                        mainBluetoothView->ChangeView(BluetoothModel::GetInstance()->GetCurView(), BLUETOOTHRECONNECTVIEW);
+                        errcode_t retVal = BluetoothModel::GetInstance()->ConnectRemoteDevice(&addr);
+                        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ConnectRemoteDevice] retVal =  %d", retVal);
+                    }
+                }
+                else if (view.GetViewType() == UIViewType::UI_IMAGE_VIEW) /*点击的是图片*/
+                {
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UIViewType::UI_IMAGE_VIEW,%s", reinterpret_cast<const char *>(bluetoothInfo_.deviceName));
+                    mainBluetoothView->ChangeView(BluetoothModel::GetInstance()->GetCurView(), BLUETOOTHEOPTIONSVIEW);
+                    BluetoothOptionsView *bluetoothOptionsView = BluetoothOptionsView::GetInstance();
+                    if (bluetoothOptionsView == nullptr)
+                    {
+                        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OnClick bluetoothOptionsView new fail");
+                        return false;
+                    }
+                    bluetoothOptionsView->SetCurrentAddr(addr);
+                    bluetoothOptionsView->RefreshText();
+                }
             }
-        }
-       
-        return true;
-    }
 
-private:
-    BluetoothCaseInfo bluetoothInfo_{};
-    bd_addr_t addr;
-};
+            return true;
+        }
 
+    private:
+        BluetoothCaseInfo bluetoothInfo_{};
+        bd_addr_t addr;
+    };
 
-UIView *BluetoothDeviceCaseListAdapter::GetView(UIView *inView, int16_t index)
-{
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BluetoothDeviceCaseListAdapter GetView");
-    List<BluetoothCaseInfo> &bluetoothCaseList = BluetoothModel::GetInstance()->GetConnedDevicesCase();
-    if (bluetoothCaseList.IsEmpty()) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothCaseList IsEmpty");
-        return nullptr;
-    }
-    if ((index > bluetoothCaseList.Size() - 1) || (index < 0)) {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BluetoothDeviceCaseListAdapter::GetView err,%d,%d",index,bluetoothCaseList.Size());
-        return nullptr;
+    BluetoothDeviceCaseListAdapter::~BluetoothDeviceCaseListAdapter()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BluetoothDeviceCaseListAdapter::~BluetoothDeviceCaseListAdapter");
+        if (g_btOnClickListListener != nullptr)
+        {
+            delete g_btOnClickListListener;
+            g_btOnClickListListener = nullptr;
+        }
     }
-    ListNode<BluetoothCaseInfo>* node = bluetoothCaseList.Begin();
-    for (uint16_t i = 0; i < index; i++) {
-        node = node->next_;
+
+    uint16_t BluetoothDeviceCaseListAdapter::GetCount()
+    {
+        return BluetoothModel::GetInstance()->GetConnedDevicesCase().Size();
     }
-    node->data_.index = index;
-    BluetoothCaseInfo itemData = node->data_;
-    if (inView == nullptr) {
-        item = new BluetoothItemView();
-        if (item == nullptr) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetView item err");
+
+    UIView *BluetoothDeviceCaseListAdapter::GetView(UIView *inView, int16_t index)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BluetoothDeviceCaseListAdapter GetView");
+        List<BluetoothCaseInfo> &bluetoothCaseList = BluetoothModel::GetInstance()->GetConnedDevicesCase();
+        if (bluetoothCaseList.IsEmpty())
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothCaseList IsEmpty");
             return nullptr;
         }
-    } else {
-        item = static_cast<BluetoothItemView *>(inView);
-    }
-    item->SetViewIndex(index);
-    item->SetItemInfo(itemData, false);
-    item->SetConnectionstatus(itemData);
+        if ((index > bluetoothCaseList.Size() - 1) || (index < 0))
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BluetoothDeviceCaseListAdapter::GetView err,%d,%d", index, bluetoothCaseList.Size());
+            return nullptr;
+        }
+        ListNode<BluetoothCaseInfo> *node = bluetoothCaseList.Begin();
+        for (uint16_t i = 0; i < index; i++)
+        {
+            node = node->next_;
+        }
+        node->data_.index = index;
+        BluetoothCaseInfo itemData = node->data_;
+        if (inView == nullptr)
+        {
+            item = new BluetoothItemView();
+            if (item == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetView item err");
+                return nullptr;
+            }
+        }
+        else
+        {
+            item = static_cast<BluetoothItemView *>(inView);
+        }
+        item->SetViewIndex(index);
+        item->SetItemInfo(itemData, false);
+        item->SetConnectionstatus(itemData);
 
-    listener = item->GetOnClickListener();
-    if (listener != nullptr) {
-        delete listener;
-        listener = nullptr;
-    }
-    listener = new BluetoothDeviceOnClickListListener(&node->data_);
-    if (listener == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetView BluetoothDeviceOnClickListListener err");
-        return nullptr;
+        if (g_btOnClickListListener == nullptr)
+        {
+            g_btOnClickListListener = new BluetoothDeviceOnClickListListener();
+            if (g_btOnClickListListener == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BluetoothDeviceCaseListAdapter::GetView new fail");
+                return nullptr;
+            }
+        }
+        listener = static_cast<UIView::OnClickListener *>(g_btOnClickListListener);
+        item->SetViewOnClickListener(listener);
+        sprintf_s(addrTmp, sizeof(addrTmp), "%02x%02x%02x%02x%02x%02x", node->data_.addr[0], node->data_.addr[1],
+                  node->data_.addr[2], node->data_.addr[3], node->data_.addr[4], node->data_.addr[5]); // 没有%s类型,不做返回判断
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "addrTmp %s", addrTmp);
+        return item;
     }
-    sprintf_s(addrTmp, sizeof(addrTmp), "%02x%02x%02x%02x%02x%02x", node->data_.addr[0], node->data_.addr[1],
-        node->data_.addr[2], node->data_.addr[3], node->data_.addr[4], node->data_.addr[5]); // 没有%s类型,不做返回判断
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "addrTmp %s", addrTmp);
-
-    // item->SetOnClickListener(listener);
-    item->SetViewOnClickListener(listener);
-    return item;
-}
 } // namespace OHOS
\ No newline at end of file