Java 在Android中组合来自两个侦听器的数据

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

我正在从事一个Android项目(Tango),其中涉及从两个事件侦听器获取数据,并将这些值组合成一个JSON字符串并发送到服务器

下面的代码块说明了我想从中读取数据的两种方法

  • onPoseAvailable()
  • onPointCloudAvailable()
  • 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)调用,因此您还必须同步对该方法的访问。希望它能给您一些帮助,但如果需要,将详细说明

    为什么不为匿名内部
    回调声明字段
    ?或者只有一个外部最终变量可以是数据容器。为什么不为匿名内部
    回调声明一个字段?或者只有一个外部最终变量可以是数据容器。