我正在与BLE设备通信,该设备通过一个特征向我发送大量数据.相同的CH用于向设备发送数据.
在机器人内部BluetoothGattCharacteristic有方法
public byte[] getValue() {
return mValue;
}
public boolean setValue(byte[] value) {
mValue = value;
return true;
}
Run Code Online (Sandbox Code Playgroud)
但是,执行发生在不同的线程中.Android运行大约5个不同的绑定线程,他们调用
onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic)
我现在尝试在回调中抓取数组作为第一个操作,但不能保证另一个线程(不在我的控制下)同时设置数组.
虽然上面似乎可以解决这个问题,但更复杂的问题是针对传入的数据流发送数据.
我必须使用相同的CH将数据发送到设备,所以我setValue()和我BluetoothGatt.writeCharacteristic.
public boolean writeCharacteristic(BluetoothGattCharacteristic characteristic) {
// some null checks etc
//now it locks the device
synchronized(mDeviceBusy) {
if (mDeviceBusy) return false;
mDeviceBusy = true;
}
//the actual execution
return true;
}
Run Code Online (Sandbox Code Playgroud)
然后我会在某个时候从某个线程接收回调
onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status)
Run Code Online (Sandbox Code Playgroud)
但是,当我抓住该值并尝试检查它是否是我想要发送的内容时,有时它已经是一个刚刚从其他线程更新的已接收包.
如果不访问Androids BLE API或堆栈等,我怎样才能使这更安全?
我有一个相当庞大的字符串文件,其中包含大约600个字符串.一些开发人员只是为他们编写的每个模块都将其字符串放入其中.那里有很多不再使用或已被替换的字符串.还有一些更普遍的错误消息,这些消息存在于几个变种中,应该只用一个替换.
通过选择,复制粘贴到搜索中我经历了50左右,看看它们是否仍在代码中使用... eclipse/lint为我做的,xcode 5(仍然)似乎没有这个功能.
现在我发现了一个插件(LIN),可以更容易地选择/自动完成字符串,但我仍然有大约600个未经检查的字符串.
现在只存在一种语言,但是第二种语言即将到来,所以我希望在此之前清理混乱.
我读过了
iphone - 清理Localizable.strings
但找到答案非常不切实际
/编辑
有什么策略可以完成这项工作并向我展示结果?我觉得在IDE的石器时代
多年来困扰我的事情.我使用了很多蓝牙和最近的wifi流(spp).这些流始终连接到特定设备,并通过简单的字节命令进行通信.
一些设备(他们的微控制器)我自己编程,我必须始终检查线上的信号是否是我所期望的,发送和检查crcs.
不知何故,我想在我的智能手机上做同样的事情,因为我用"readByte"访问我的流并逐字节读取,我总是想知道是否实际上可能a)消息中的一个字节可能丢失b)消息到达混合或"不按顺序"
我不知道底层硬件有多少功能.它是否使用crc检查每条消息,并在消息损坏时再次请求消息?或者它是否盲目地将每个字节传递给我的"readByte"方法?
如果设备发送消息a然后b,是否有可能接收器在a之前接收b并在传递我的代码b之前或甚至混合像拉链这样的字节并给我一个[0]然后b [0]然后a [1]等等.
我应该对这些流有多少信任?一些澄清将不胜感激
在Android中,我创建了一个扩展的抽象类View(我无法访问的Android类).抽象类会覆盖视图
@Override
protected final void onDraw(Canvas canvas) {
if(conditions) return;
// child classes should only draw if this class gives the ok
subDraw(canvas);
}
protected abstract void subDraw(Canvas canvas);
Run Code Online (Sandbox Code Playgroud)
但是我在这里添加了final关键字.
关键是,我创建了一个抽象方法,子类应该使用而不是onDraw.所以我阻止onDraw被任何进一步覆盖,它的工作原理.
我知道有一些设计可以让它变得更好,但是这种设计就像一个没有太多变化的魅力.如果做上述操作在运行时或其他问题上有不必要的副作用,我的问题更为一般?
经过多年信任生命周期,我做了一点挖掘.现在我不觉得好笑.
我知道并阅读了很多关于onStop不能保证被称为等的内容.
我创建了一个带有2个Activites和一个自定义Application类的简单应用程序.我在每个回调中放了一个Log.d(),我可以在一个带有4.1的Galaxy S2上找到并玩.活动A在启动时启动,并在onResume启动时启动活动B.活动B有一个创建Nullpointer的按钮,但是它什么都不做.
现在担心/混淆我的事情:
如果我在buttonclick上创建一个nullpointer,应用程序崩溃并且两个活动都没有回调
如果我按下电源按钮并关闭屏幕,如果活动的显示模式(纵向或横向)与设备的原始方向不匹配,活动将重新启动.我知道这和我如何覆盖它,但如果它破坏并重新启动我的活动它调用onPause并isFinishing()返回false但活动正在完成并重新启动.
如果上面没有发生,onPause即使应用程序不再可见,也只会被调用
onPause在A中启动另一个活动调用,然后创建B onResume然后调用onStopA.现在我在.App类中跟踪我的活动,如果我取消注册A onPause并注册B in onResume,将会有一个分裂毫秒没有注册任何活动.如果我想在没有任何活动时关闭某些服务,它会一直发生.但是如果我取消注册它onStop(因此它们会重叠),当用户点击电源按钮并且服务(或线程或其他)继续运行并耗尽电池电量时,它将永远不会被注销.
我正在使用android已经有一段时间了,我正试图实现一个相当复杂或让我们说防弹设计.但几乎不可能跟踪我的活动发生了什么.
必须通过Intent.ACTION_SCREEN_OFF检测断电,但是当它已经关闭时会发生.之前唯一的事就是onPause.
homebutton ... onUserInteraction和pause/stop的某种组合
很难简单地确定我的APP(不仅仅是一个活动)何时不再被使用并放入后台以及何时只是在活动之间转换或何时被系统关闭.因为.App类没有回调终止,因为onTerminate()只在模拟器中使用,所以文档说.
也许我只是没有看到森林穿过树林...帮助将不胜感激!
const int array[] = {1,2};
const int array[2] = {1,2};
Run Code Online (Sandbox Code Playgroud)
编译和工作都没有问题.这些有什么不同吗?
(我使用Codevision,但这应该不重要)