- 主题:可能需要一个std::set或者更复杂的数据结构存储安卓的一个数据
这个数据是用在这个HAL里的
Return<void> Thermal::registerThermalChangedCallback(const sp<IThermalChangedCallback> &callback, bool filterType, TemperatureType_2_0 type, registerThermalChangedCallback_cb _hidl_cb)
这里面首先传入的是callback,如果callback以前见过,就报错。那么就需要一个容器存储一下(另外需要通知所有calblack的时候也是需要这个容器的)。假定需要std::set。
我写std::set<sp<IThermalChangedCallback>> callback;结果报错,说是set需要超过一个的模板类型。就是需要比较函数。
那么,这种callback之间怎样比较?至少要能够判断两个callback不同吧?用什么呢?地址吗?
(然后,其实这个函数还传入了是不是要根据某个类型来回叫,所以其实不是std::set,可能是std::map<TemperatureType_2_0, std::set<sp<IThermalChangedCallback>>>.)
--
修改:bihai FROM 72.199.121.*
FROM 72.199.121.*
刚查到,在安卓代码库里面有个例子Thermal.cpp
using ::android::hardware::interfacesEqual;
// std::vector<CallbackSetting> callbacks_;
if (std::any_of(callbacks_.begin(), callbacks_.end(), [&](const CallbackSetting &c) {
return interfacesEqual(c.callback, callback);
})) {
status.code = ThermalStatusCode::FAILURE;
status.debugMessage = "Same callback registered already";
LOG(ERROR) << status.debugMessage;
} else {
callbacks_.emplace_back(callback, filterType, type);
LOG(INFO) << "a callback has been registered to ThermalHAL, isFilter: " << filterType
<< " Type: " << android::hardware::thermal::V2_0::toString(type);
}
不是std::set,也许他们也不知道怎么比较大小?不多的话,一个一个比较是不是相等也行吧
【 在 allegro 的大作中提到: 】
: 你用什么判断两个callback相等?
--
FROM 72.199.121.*
这个是安卓HAL层逻辑的规定,就是当有人写的程序registerThermalChangedCallback(callback);两次的时候,第二次会出错。第一次会成功。当然,如果第二次之前unregister,又可以再次register。所以需要在HAL里面实现registerThermalChangedCallback的时候要判断这个callback以前作为参数传进来没有。这个HAL的函数会被不同程序调用多次。
【 在 ble 的大作中提到: 】
: 难道不是你自己的业务需求来定义什么叫“这个callback见过”
: BTW:通常的callback应该都是一段过程,大部分甚至都是可重入的,压根就不应该搞“见过就不能执行”这种逻辑。
: 如果你需要的是调度Task,可以根据Task不可重复执行的理由给Task设置唯一标志,或者Task的逻辑就应该设置成可重入,根据相应的标志不重复执行操作就行。
: ...................
--
修改:bihai FROM 72.199.121.*
FROM 72.199.121.*