- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个 ANE,它与专有蓝牙 LE 设备的 Android SDK 接口(interface)。该 SDK 已经在纯 Android 项目上进行了测试,并且运行良好。我正在使用 FREContext.dispatchStatusEventAsync 返回有关检测到的每个信标的信息。但是,在 AIR 应用程序运行时查看从 LogCat 返回的日志时,我发现每次发现信标时都会抛出 IllegalArgumentException。有趣的是,我可以在其他任何地方使用 dispatchStatusEventAsync,而且它似乎工作正常。
这是 ANE 的所有相关代码。 (我通过查找/替换掩盖了 SDK 的名称,但代码可以编译,所以如果类或函数的命名有问题,请不要认为这是一个可能的问题)。
“DUMMY”语句仅表示它们用于调试。
BecsterExtension.java
public class BecsterExtension implements FREExtension
{
public static final String TAG = "BecsterExtension";
@Override
public FREContext createContext(String arg0)
{
return new BecsterContext();
}
@Override
public void dispose()
{
// TODO Auto-generated method stub
}
@Override
public void initialize()
{
// TODO Auto-generated method stub
}
}
BecContext.java
public class BecContext extends FREContext {
@Override
public void dispose()
{
// TODO Auto-generated method stub
}
@Override
public Map<String, FREFunction> getFunctions()
{
Map<String, FREFunction> functionMap = new HashMap<String, FREFunction>();
functionMap.put("startScanning", new StartScanFunction());
return functionMap;
}
开始扫描函数.java
private final static String TAG = StartScanFunction.class.getSimpleName();
byte[] advPacket;
public BecsterBeacon becBecMgr;
@Override
public FREObject call(FREContext context, FREObject[] args)
{
//****-----BECSTER SDK START-----****//
Log.i(TAG, "**Initializing Becster SDK**");
//this call works
context.dispatchStatusEventAsync("BECSTER_DUMMY", "Becster SDK has started initalizing");
if (!context.getActivity().getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE))
{
Log.e(TAG, "Bluetooth LE not supported or disabled");
return null;
}
// Initializes a Bluetooth adapter. For API level 18 and above, get a reference to
// BluetoothAdapter through BluetoothManager.
final BluetoothManager bluetoothManager =
(BluetoothManager) context.getActivity().getSystemService(Context.BLUETOOTH_SERVICE);
Log.i(TAG, "Starting Becster Beacon Manager");
becBecMgr = new BecsterBeacon(bluetoothManager, new BecNotifyHandler(context));
Log.i(TAG, "**Becster SDK Initialized**");
//this call works
context.dispatchStatusEventAsync("BECSTER_DUMMY", "Becster SDK has finished initalizing");
BecBecMgr.startLEScan();
return null;
}
BecNotifyHandler.java(这实现了从内部调用的 BecEvent 函数 becsterEventNotify
public static final String TAG = "BecNotifyHandler";
private FREContext context;
public BecNotifyHandler(FREContext context)
{
context.dispatchStatusEventAsync("BECSTER_DUMMY", "BecNotifyHandler has been initialized");
this.context = context;
}
@Override
public void becsterEventNotify(BecPkt event)
{
try
{
Log.i(TAG, "Notifying of Becster event. Context: " + context);
//this call ALWAYS throws the IllegalArgumentException
context.dispatchStatusEventAsync("BECSTER_NOTIFY", "Becster notify");
Log.i(TAG, "Notified");
}
catch (IllegalArgumentException e)
{
e.printStackTrace();
}
}
日志:
07-17 10:50:33.949: I/BecNotifyHandler(17467): Notifying of Becster event. Context: com.company.sdk.BecsterContext@41e2df30
07-17 10:50:33.949: W/System.err(17467): java.lang.IllegalArgumentException
07-17 10:50:33.949: W/System.err(17467): at com.adobe.fre.FREContext.dispatchStatusEventAsync(Native Method)
07-17 10:50:33.949: W/System.err(17467): at com.company.sdk.BecNotifyHandler.becsterEventNotify(BecNotifyHandler.java:27)
07-17 10:50:33.949: W/System.err(17467): at com.becster.becsterSDK.BecsterBeacon$1$1.run(BecsterBeacon.java:280)
07-17 10:50:33.949: W/System.err(17467): at android.os.Handler.handleCallback(Handler.java:733)
07-17 10:50:33.949: W/System.err(17467): at android.os.Handler.dispatchMessage(Handler.java:95)
07-17 10:50:33.949: W/System.err(17467): at android.os.Looper.loop(Looper.java:136)
07-17 10:50:33.949: W/System.err(17467): at android.app.ActivityThread.main(ActivityThread.java:5141)
07-17 10:50:33.949: W/System.err(17467): at java.lang.reflect.Method.invokeNative(Native Method)
07-17 10:50:33.957: W/System.err(17467): at java.lang.reflect.Method.invoke(Method.java:515)
07-17 10:50:33.957: W/System.err(17467): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
07-17 10:50:33.957: W/System.err(17467): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611)
07-17 10:50:33.957: W/System.err(17467): at dalvik.system.NativeStart.main(Native Method)
非常感谢任何见解!
最佳答案
context.dispatchStatusEventAsync 继续产生一些非常奇怪的结果。当我调用一次 becsterEventNotify 时,我会收到正确的消息。背靠背调用 becsterEventNotify 两次未产生任何消息分派(dispatch)。因此,我仍然不确定是什么导致了这个问题。我怀疑线程可能存在问题,因为我曾一度使用 Thread.sleep(1000) 来查看在消息之间放置一些时间是否会有所帮助,但这导致根本没有消息被发送。
如果有人好奇,我确实想出了一个解决方法。我没有使用 dispatchStatusEventAsync,而是创建了一个静态的字符串向量来保存来自信标的数据(id、电池生命周期和 rssi)。
public static Vector<String> packets = new Vector<String>();
然后将这个 gem 添加为一个函数:
public class GetNextPacketFunction implements FREFunction
{
private static final String TAG = GetNextPacketFunction.class.getSimpleName();
@Override
public FREObject call(FREContext context, FREObject[] args)
{
Vector<String> packets = BecsterExtension.packets;
if (packets != null && packets.size() > 0)
{
String nextPacket = packets.remove(packets.size() - 1);
Log.i(TAG, "Found packet: " + nextPacket);
try
{
return FREObject.newObject(nextPacket);
}
catch (FREWrongThreadException e)
{
Log.e(TAG, "WRONG THREAD!");
e.printStackTrace();
}
}
return null;
}
}
然后我像这样实现了通知程序来保存数据包:
@Override
public void becsterEventNotify(BecPkt event)
{
String newPacket = btIDStr + ";" + event.getBattVal() + ";" + event.getRssiVal();
BecsterExtension.packets.add(newPacket);
Log.i(TAG, "Number of packets in queue: " + BecsterExtension.packets.size());
}
然后在 AS 端,我使用定时器每秒轮询新数据包(尚未确定这是否是最佳间隔):
var packetTimer:Timer = new Timer(1000);
packetTimer.addEventListener(TimerEvent.TIMER, function (e:TimerEvent):void
{
var newPacket:String = getNextPacket();
if (newPacket != null)
{
var data:Array = newPacket.split(";");
var becEvent:BecEvent = new BecEvent(BecEvent.NOTIFY);
becEvent.id = data[0];
becEvent.battLife = data[1];
becEvent.rssi = data[2];
dispatchEvent(becEvent);
}
});
packetTimer.start();
这种方法目前运行良好,我更喜欢它,因为我可以在 AS 端管理队列。
谢谢大家!
关于android - 上下文 dispatchStatusEventAsync 抛出 IllegalArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24807140/
在使用客户端应用程序和OAuth2授权服务器时出现错误。我用的是Spring。我已经设置了授权服务器、资源服务器和客户端。使用cURL时,授权服务器和资源服务器工作正常。但是,当我为客户端编写设置(包
在使用客户端应用程序和OAuth2授权服务器时出现错误。我用的是Spring。我已经设置了授权服务器、资源服务器和客户端。使用cURL时,授权服务器和资源服务器工作正常。但是,当我为客户端编写设置(包
我希望你能找到我的文字,因为我真的对我的项目感到困惑,因为应用程序不能安装在模拟器中。我希望你的建议和指导。这是运行应用程序时的日志记录。RegisterViewModel.kt。密封的类资源.kt。
我正在尝试制作按钮,单击它们时会播放声音。但我有一个麻烦。我实在搞不清楚。这是我的代码: import javafx.application.Application; import javafx.ev
我正在查看一些遗留代码,发现一个部分导致我得到“比较方法违反了其一般契约!”错误。我知道这个错误是代码不具有传递性的结果,但我不完全理解如何正确修复它。 这是导致错误的代码。 private void
运行以下方法时,我不断收到 IllegalArgumentException: public int randomize(ArrayList list){ Random rdm = new R
我想给 Jenkins 添加一个新的 slave。当我遵循 Jenkins UI 时,它给了我下面的命令 java -jar agent.jar -jnlpUrl http:///computer//
我正在使用运行时反射来加载一个包含以下两个方法的类: public static void foo(int[] args) { System.out.print("foo invoked: "
我已经使用以下查询来匹配所有文档 { "query": { "custom_score": { "query": { "query_string": {
我有这个命令: list.stream() .filter(e -> ...) .sorted(comparatorShuffle()) .findAny() .orE
我收到以下运行时错误: checkParameterIsNotNull, parameter oneClickTokens at com.info.app.fragments.Fragmen
我有两个列表: (def xxa ["olp" "xyz"]) (def xxb ["ulove" "alove" "holp" "sholp"]) 还有一个函数尝试获取第一个列表的元素,这些元素是第
在我的代码中,我在向服务器执行请求的行中捕获了 IllegalArgumentException(索引 85 处查询中的非法字符)。使用 was build as patter 命令,另一个任务正确完
我试图将 String[] 放入 jsonObject 并收到以下错误 java.lang.IllegalArgumentException: Invalid type of value. Type:
我过去的一个试卷问题要求我修改一个方法,以导致发生 IllegalArgumentException。 该方法仅涉及从银行帐户余额中提取资金 这是执行此操作的方法。 公共(public)无效提款(双倍
我这里遇到了一点问题。我想弄清楚如何捕获 IllegalArgumentException。对于我的程序,如果用户输入负整数,程序应该捕获 IllegalArgumentException 并询问用户
每当插件尝试运行此延迟的任务时,我都会收到“ IllegalArgumentException:插件不能为空”错误: Bukkit.getServer().getScheduler().sched
我有这个命令: list.stream() .filter(e -> ...) .sorted(comparatorShuffle()) .findAny() .orE
我在更改应用程序中的场景时遇到问题,看起来像 Main screen > Login screen 我在主文件中将屏幕存储为 hashmap一切都很好,直到我从登录屏幕返回到主屏幕并想再次加载登录屏幕
我在这里缺少什么? 我得到异常:java.lang.IllegalArgumentException:对象不是声明类的实例 public boolean onSave(Object entity,Se
我是一名优秀的程序员,十分优秀!