单独线程中的 Android 传感器 registerListener

Sae*_*ani 2 java android android-service android-asynctask android-handler

我写了一个服务来记录后台的加速度计值。这个想法是注册传感器侦听器并将值写入存储。我已经启用了StrictMode.enableDefaults()MainActivity应用程序(不在服务)的检查,如果在自己的线程在服务运行。但事实并非如此!我不知道是什么问题......我有这个AsyncTask类,我希望解决这个问题,但它显然没有(这是在服务内部,它的执行方法是从服务的方法中调用onCreate的。

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

log cat 中的 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)
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我出了什么问题吗?如果需要,这是我的服务的完整代码:http : //pastebin.com/NRm376BL

Sae*_*ani 5

我发现问题是,我应该创建 aHandlerThread和 aHandler并将处理程序传递给registerListener方法的重载。如果您不提供此参数,则侦听器将由主线程处理,并且大多数情况下这不是您要查找的内容。

对于示例实现,请检查此代码:特别是用于处理另一个线程上的传感器侦听器而不是主线程

http://pastebin.com/QuHd0LNU