Java 在Android中组合来自两个侦听器的数据
我正在从事一个Android项目(Tango),其中涉及从两个事件侦听器获取数据,并将这些值组合成一个JSON字符串并发送到服务器 下面的代码块说明了我想从中读取数据的两种方法Java 在Android中组合来自两个侦听器的数据,java,android,google-project-tango,Java,Android,Google Project Tango,我正在从事一个Android项目(Tango),其中涉及从两个事件侦听器获取数据,并将这些值组合成一个JSON字符串并发送到服务器 下面的代码块说明了我想从中读取数据的两种方法 onPoseAvailable() onPointCloudAvailable() mTango.connectListener(框架对,新的Tango.TangoUpdateCallback(){ @凌驾 PoseAvailable上的公共空间(Tangopoa pose){ //从姿势中获取值 } @凌驾 公共无效o
mTango.connectListener(框架对,新的Tango.TangoUpdateCallback(){
@凌驾
PoseAvailable上的公共空间(Tangopoa pose){
//从姿势中获取值
}
@凌驾
公共无效onPointCloudAvailable(TangoPointCloudData点云){
//从点云获取值
}
}
我必须向服务器发送一个JSON字符串,格式如下
{
姿势:“来自onPoseAvailable的姿势值”,
点云:“onPointCloudAvailable中的点云”,
时间戳:“从姿势对象内部可用的字段派生的时间”
}
是否有一种技术或方法可以用于将两个读数组合在一起;pose和pointCloud在方法体中同时可用,以便将两个值连接成一个JSON或字符串
能给我一点小费吗?:)谢谢你 如果需要在发送到服务器之前调用这两个方法,则可以为每个回调使用两个类字段,其中最后一个值用于每个回调,然后在调用回调方法时,它会检查另一个回调的值是否存在,如果存在,则将所有数据发送到服务器,如果不存在,则保留数据以供下次调用。实现可能如下所示:
public class Foo {
private TangoPoseData mLastTangoPoseData;
private TangoPointCloudData mLastTantoPointCloudData;
public void bar() {
mTango.connectListener(framePairs, new Tango.TangoUpdateCallback() {
@Override
public void onPoseAvailable(TangoPoseData pose) {
mLastTangoPoseData = pose;
sendToServer();
}
@Override
public void onPointCloudAvailable(TangoPointCloudData pointCloud) {
mLastTantoPointCloudData = pointCloud;
sendToServer();
}
}
}
public void sendToServer() {
if (mLastTangoPoseData == null || mLastTantoPointCloudData == null) return;
makeApiCall(mLastTangoPoseData, mLastTantoPointCloudData);
mLastTangoPoseData = null;
mLastTantoPointCloudData = null;
}
}
如果您需要在发送到服务器之前调用这两个方法,那么可以为每个回调调用两个类字段,其中的最后一个值用于每个回调,然后在调用回调方法时,它会检查另一个回调的值是否在那里,如果在那里,则将所有数据发送到服务器,如果没有,则只保留下一个要调用的回调的数据。实现可能如下所示:
public class Foo {
private TangoPoseData mLastTangoPoseData;
private TangoPointCloudData mLastTantoPointCloudData;
public void bar() {
mTango.connectListener(framePairs, new Tango.TangoUpdateCallback() {
@Override
public void onPoseAvailable(TangoPoseData pose) {
mLastTangoPoseData = pose;
sendToServer();
}
@Override
public void onPointCloudAvailable(TangoPointCloudData pointCloud) {
mLastTantoPointCloudData = pointCloud;
sendToServer();
}
}
}
public void sendToServer() {
if (mLastTangoPoseData == null || mLastTantoPointCloudData == null) return;
makeApiCall(mLastTangoPoseData, mLastTantoPointCloudData);
mLastTangoPoseData = null;
mLastTantoPointCloudData = null;
}
}
例如,您可以声明一个JSONObject,并在方法执行时存储所需的字段
private org.json.JSONObject mJSONMap = new org.json.JSONObject();
mTango.connectListener(framePairs, new Tango.TangoUpdateCallback() {
@Override
public void onPoseAvailable(TangoPoseData pose) {
// Get values from pose
mJSONMap.put("pose" , "pose value from onPoseAvailable");
mJSONMap.put("timeStamp" , "Do timestamp modifications here");
doSomethingWithMap( mJSONMap );
}
@Override
public void onPointCloudAvailable(TangoPointCloudData pointCloud) {
// Get values from pointCloud
mJSONMap.put("pointCloud" , "pointCloud from onPointCloudAvailable");
doSomethingWithMap( mJSONMap );
}
private synchronized void doSomethingWithMap( org.json.JSONObject myMap )
{
System.out.println( myMap );
// check to see if your map is populated with keys
// from onPoseAvailable() and onPointCloudAvailable()?
// We must have 3keys if BOTH THE METHOD CALLS COMPLETED
if( myMap.length() == 3 )
{
//consume the map
//Clear the map after you have consumed it
// so that future callbacks
// do not mix values associated with previous callbacks
myMap.remove("pose");
myMap.remove("timeStamp");
myMap.remove("pointCloud");
}
}
}
现在,doSomethingWithMap(org.json.JSONObject)可以从onPoseAvailable(TangopObstata)或onPointCloudAvailable(TangoPointCloudData)调用,因此您还必须同步对该方法的访问。希望它能给你一些帮助,但是如果需要的话会更详细地阐述你可以声明一个JSONObject,并在方法执行时存储所需的字段,例如
private org.json.JSONObject mJSONMap = new org.json.JSONObject();
mTango.connectListener(framePairs, new Tango.TangoUpdateCallback() {
@Override
public void onPoseAvailable(TangoPoseData pose) {
// Get values from pose
mJSONMap.put("pose" , "pose value from onPoseAvailable");
mJSONMap.put("timeStamp" , "Do timestamp modifications here");
doSomethingWithMap( mJSONMap );
}
@Override
public void onPointCloudAvailable(TangoPointCloudData pointCloud) {
// Get values from pointCloud
mJSONMap.put("pointCloud" , "pointCloud from onPointCloudAvailable");
doSomethingWithMap( mJSONMap );
}
private synchronized void doSomethingWithMap( org.json.JSONObject myMap )
{
System.out.println( myMap );
// check to see if your map is populated with keys
// from onPoseAvailable() and onPointCloudAvailable()?
// We must have 3keys if BOTH THE METHOD CALLS COMPLETED
if( myMap.length() == 3 )
{
//consume the map
//Clear the map after you have consumed it
// so that future callbacks
// do not mix values associated with previous callbacks
myMap.remove("pose");
myMap.remove("timeStamp");
myMap.remove("pointCloud");
}
}
}
现在,doSomethingWithMap(org.json.JSONObject)可以从onPoseAvailable(TangopObstata)或onPointCloudAvailable(TangoPointCloudData)调用,因此您还必须同步对该方法的访问。希望它能给您一些帮助,但如果需要,将详细说明为什么不为匿名内部
回调声明字段
?或者只有一个外部最终变量可以是数据容器。为什么不为匿名内部回调声明一个字段?或者只有一个外部最终变量可以是数据容器。