0

나는 백그라운드에서 가속도계 값을 기록하는 서비스를 작성했습니다. 아이디어는 센서 리스너에 등록하고 값을 저장소에 기록하는 것입니다. 서비스가 아닌 해당 응용 프로그램의 MainActivity에있는 StrictMode.enableDefaults()을 사용하여 서비스가 자체 스레드에서 실행되는지 확인했습니다. 그러나 그렇지 않습니다! 나는 무엇이 문제인지 모르겠다. 나는이 문제를 처리하기를 희망하는이 AsyncTask 클래스를 가지고 있지만 분명히하지는 않았다. (이것은 서비스 내부에 있으며 실행 메소드는 서비스의 onCreate 메소드에서 호출된다. . 로그 고양이안드로이드 센서 registerListener 별도 스레드에

private class LogTask extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected Void doInBackground(Void... voids) { 

     mListener = new SensorEventListener() { 
      @Override 
      public void onSensorChanged(SensorEvent sensorEvent) { 

       String formatted = String.valueOf(System.currentTimeMillis()) 
         + "\t" + String.valueOf(sensorEvent.timestamp) 
         + "\t" + String.valueOf(sensorEvent.values[0]) 
         + "\t" + String.valueOf(sensorEvent.values[1]) 
         + "\t" + String.valueOf(sensorEvent.values[2]) 
         + "\r\n"; 

       //if (mIsServiceStarted && mFileStream != null && mLogFile.exists()) { 
       if (mFileStream != null && mLogFile.exists()) { 

        try { 
         mFileStream.write(formatted.getBytes()); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 

      @Override 
      public void onAccuracyChanged(Sensor sensor, int accuracy) { 

      } 
     }; 

     mSensorManager.registerListener(
       mListener, mSensor, SensorManager.SENSOR_DELAY_FASTEST 
     ); 

     return null; 
    } 
} 

StrictMode 다음 줄이 정책이 무효화되는 것을 특별히 포인트 :

mFileStream.write(formatted.getBytes()); 

StrictMode policy violation; ~duration=0 ms: android.os.StrictMode$StrictModeDiskWriteViolation: policy=31 violation=1 
      at android.os.StrictMode$AndroidBlockGuardPolicy.onWriteToDisk(StrictMode.java:1092) 

누군가가 잘못 무슨 일이 일어나고 있는지 말해 줄 수 requried 경우 다음 내 서비스의 전체 코드? http://pastebin.com/NRm376BL

답변

2

나는 문제가 있다는 것을 알아 냈습니다. HandlerThreadHandler을 생성하고 처리기를 registerListener 메서드의 오버로드로 전달해야합니다. 이 인수를 제공하지 않으면 리스너는 주 스레드에 의해 처리되며 대부분의 경우 사용자가 찾고자하는 것이 아닙니다. 예시적인 구현에

이 코드를 확인 : 특히 메인 스레드가 다른 스레드에없는 센서 수신기를 처리하기위한

http://pastebin.com/QuHd0LNU

관련 문제