【问题标题】:Combining data from two listeners in Android在 Android 中组合来自两个侦听器的数据
【发布时间】:2017-06-30 07:37:02
【问题描述】:

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

以下代码块说明了我要从中读取数据的两种方法。

  1. onPoseAvailable()
  2. onPointCloudAvailable()
mTango.connectListener(framePairs, new Tango.TangoUpdateCallback() {
        @Override
        public void onPoseAvailable(TangoPoseData pose) {
            // Get values from pose
        }

        @Override
        public void onPointCloudAvailable(TangoPointCloudData pointCloud) {
            // Get values from pointCloud
        }
}

我必须向服务器发送一个 JSON 字符串,格式如下

{
    pose:"pose value from onPoseAvailable",
    pointCloud:"pointCloud from onPointCloudAvailable",
    timeStamp:"time derived from fields available inside pose object"
}

有没有一种技术或方法可以用来结合两种阅读方式?姿势和 pointCloud 同时在方法体中可用,以便我可以将两个值连接成一个 JSON 或字符串?

我可以给点小费吗? :) 提前非常感谢!

【问题讨论】:

  • 为什么不为匿名内部callback声明一个字段?或者只是 1 个可以作为数据容器的外部最终变量。

标签: java android google-project-tango


【解决方案1】:

如果你需要在发送到服务器之前调用这两个方法,你可以有两个类字段,每个回调的最后一个值,然后当一个回调方法被调用时,它会检查另一个回调的值是否存在,如果是,则将所有数据发送到服务器,如果不是,则保留数据以供下一个回调调用。实现可能如下所示:

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;
    }
}

【讨论】:

    【解决方案2】:

    您可以声明一个 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(TangoPoseData)onPointCloudAvailable(TangoPointCloudData) 调用,因此您必须也可以同步访问此方法。希望能给你一些帮助,如果需要的话会更详细的说明

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-28
      • 2012-02-22
      • 1970-01-01
      • 2015-10-31
      • 2013-03-30
      • 2013-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多