2016-11-17 4 views
0

그래서 저는 지금 당장이 과제에 어려움을 겪어 왔습니다. 다른 가능성을 모색하고 '큐잉'이 발생하는 곳을 좁히고 있습니다. 먼저 내가하려고하는 것을 설명해 드리겠습니다.onSensorChanged()의 일관되지 않은 큐잉 방지

무엇을하고 싶습니까?
Google Wearable 서비스 (Sony Smartwatch 3에서 실행)로 Android 앱 (Google Pixel에서 실행)을 작성하여 가능한 한 빨리 smartwatch에서 센서 데이터를 검색하고 결과를 Verbose로 기록합니다. 현재 약 150Hz에서 발생하며 TYPE_ROTATION_VECTOR의 데이터입니다. 이 데이터는 PrintWriter을 사용하여 채널 (출력 스트림)을 통해 전송되고 BufferReader을 사용하여 동일한 채널 (입력 스트림)에서 전화로 검색됩니다. DataApi가 전달을 보장하므로 ChannelApi를 사용하고 있지만 데이터 손실이 덜 중요한 실시간으로 센서 데이터를 가능한 한 빨리 전달하는 것이 내 목표입니다. 현재 다른 랩톱에서 ADB를 읽고 있는데 다른 응용 프로그램에서 사용하고 있습니다.

문제점/문제점은 무엇입니까?
내 프로그램의 여러 단계에서 시스템 시간을 얻은 후 데이터 대기열이 ADB 연결이나 입력 또는 출력 스트림이나 인쇄기의 오류가 아니라는 것을 발견했습니다. sensorEvent이 발생하면 즉시 onSensorChanged() 함수가 호출되지 않는 것 같습니다. 아래의 시간은 sensorListener이 SENSOR_DELAY_GAME (로 설정하여, 각 onSensorChanged() 이벤트에 대한 데이터로 전송뿐만 아니라 SENSOR_DELAY_FASTEST를 차지하고 있으며, 설명하기

  • 를 1 행 :. onSensorChanged()
  • 2라고 시계에 System.currentTimeMillis() 행 :

    ,691,363 다음 event.timestampsensorEvent

이로부터 (1000000 나눈는 밀리 초에서 나노가는)는 몇 센서 판독에 대해 간략히 당신이 시간의 차이를 보면210

1479407287638; 687629; 
1479407287638; 687649; 
1479407287681; 687669; 
1479407287681; 687689; 
1479407287718; 687709; 
1479407287718; 687729; 
1479407287768; 687749; 
1479407287768; 687769; 
1479407287810; 687789; 
1479407287811; 687809; 

당신이 얻을 :

-  - 
0; 20 
49; 20 
0; 20 
37; 20 
0; 20 
50; 20 
0; 20 
42; 20 
1; 20 

당신이 볼 수있는 바와 같이, sensorTimestamp 나타냅니다 20ms마다이 수치에게 있습니다. 그러나 onSensorChanged()은 동일한 간격 또는 적어도 일관성으로 호출되지 않습니다. 빠른 속도에서도 채널과 입력 및 출력 기록기는 더 긴 기간이나 시간에도 바이트/메시지의 양을 따라 잡을 수 있습니다.

무엇을 시도 했습니까?

나는 내가 착용 할 수있는 응용 프로그램을 작성 내가 onSensorChanged에서 모든 작업을 제거하려 onSensorChanged

public void onSensorChanged(SensorEvent event) { 
    final int accuracy = event.accuracy; 
    final long timestamp = event.timestamp; 
    final float[] values = event.values; 
    final String sensorName = event.sensor.getStringType(); 

    if (data_transfer) {      // if interaction is initiated 
     printWriter.println(message); 
    } 
} 

에서 모든 작업을 제거하기 위해 노력하고 처음에 초기화 된 스레드

if (data_transfer) {      // if interaction is initiated 
    new Thread(new convertAndSend(sensorName,timestamp,accuracy,values)).run(); 
} 

다른 곳에서 그들을 실행 활동으로, 그러나 나는 또한 서비스로 전환했다 (배경에서 달리는)

public class SensorService extends Service implements SensorEventListener { 
... 
    public void onSensorChanged(SensorEvent event) { 
     client.sendSensorData(event.sensor.getType(), event.accuracy, event.timestamp/1000000, event.values); //client takes care of outputstream 
    } 
} 

마지막으로 을 별도의 스레드 (thisthis)에 구현하려고 했으므로 활동 또는 서비스 스레드의 영향을받지 않습니다. 그러나 이것은 또한 앞서 언급 한 것과 동일한 이슈/도전을 보여주었습니다.

public class SensorListenerThread implements Runnable { 

    private static final String TAG = "SensorService"; 
    private final static int SENS_ROTATION_VECTOR = Sensor.TYPE_ROTATION_VECTOR; 

    SensorManager mSensorManager; 

    @Override 
    public void run() { 
     Log.d("RunTag", Thread.currentThread().getName()); // To display thread 

     mSensorManager = ((SensorManager)getSystemService(SENSOR_SERVICE)); 

     Looper.prepare(); 
     Handler handler = new Handler(){ 
      // process incoming messages here?? 
     }; 
     Sensor rotationVectorSensor = mSensorManager.getDefaultSensor(SENS_ROTATION_VECTOR); 
     MySensorListener msl = new MySensorListener(); 
     mSensorManager.registerListener(msl, rotationVectorSensor, SensorManager.SENSOR_DELAY_FASTEST, handler); 

     Looper.loop(); 
    } 

    private class MySensorListener implements SensorEventListener { 
     public void onAccuracyChanged (Sensor sensor, int accuracy) {} 
     public void onSensorChanged(SensorEvent sensorEvent) { 
      Log.d("ListenerTag", Thread.currentThread().getName()); // To display thread 
     } 
    } 

} 

도움말!
내 이해는 onSensorChanged 이벤트가 호출되었지만 센서의 타임 스탬프가 나타내는 것과 같은 시간에 나타나지 않는 것입니다. 속도와 채널을 잘 사용하지만이 문제를 해결할 수없는 것 같습니다. 내 마음 속에 계획 B가 있습니다. 저는 센서 타임 스탬프를 사용하여 노트북에서 실행중인 프로그램을 계산/조정할 수 있습니다. 그러나 필자는 의사 소통의 지연 (센서 -> 랩톱 응용 프로그램)을 조정하는 것을 선호하며 의사 소통의 불일치에 대해서는 조정하지 않습니다 (값 인쇄의 차이점, 각 판독 값에 대해 계산 될 필요가 있음).

이 긴 (미안 해요!) 이야기가 의미가 있고 누군가가 나를 도울 수 있거나 올바른 방향으로 나를 가리킬 수 있기를 바랍니다.

+0

더 복잡한 상호 작용을 처리하려면 [작업자 스레드] (https://developer.android.com/guide/components/processes-and-threads.html)의 사용을 확인하십시오. 주어진 문서에서 언급했듯이 UI 스레드에서 전달 된 메시지를 처리하려면 작업자 스레드에서 [처리기] (https://developer.android.com/reference/android/os/Handler.html)를 사용하는 것이 좋습니다. 가장 좋은 해결책은 UI와 상호 작용해야하는 작업자 스레드 작업의 실행을 단순화하는 [AsyncTask 클래스] (https://developer.android.com/reference/android/os/AsyncTask.html)를 확장하는 것입니다. . – Teyam

+0

안녕하세요 @Teyam, onSensorchanged() 메시지 만 받기 위해 작업자 스레드를 구현했습니다. 더 이상 UI 스레드를 방해하지 않습니다. 그러나이 경우에도 메시지는 일정한 시간 간격으로 수신됩니다. 센서 메시지 (타임 스탬프)와 메시지 수신 (onSensorChanged) 사이의 시간이 일관 될 수있는 방식으로 코드를 생성 할 수 있기를 바랬습니다. 이제는 현재 센서 타임 스탬프를보고 발생 시간을 계산해야합니다. – Dave

답변

0

보이는 것처럼 onSensorChanged()의 일관된 호출에 의존하지 못할 수도 있습니다. 그러므로 나는 onSensorChanged 시간보다는 타임 스탬프를 사용하고 있습니다. 나는 다른 사람들에게도 똑같이 충고 할 것입니다!

관련 문제