Отзывчивость сенсора Android - PullRequest
0 голосов
/ 05 марта 2011

У меня есть приложение в Android, которое сбрасывает значения датчика в память SD-карты телефона и убивает себя, когда я нажимаю кнопку на экране.Я использую Sensor_delay_fastest, чтобы получить максимальное обновление датчиков.

Моя проблема в том, что, поскольку я выполняю все свои вычисления в потоке пользовательского интерфейса, кнопка реагирует очень долго, что очень плохо для моего приложения, поскольку записывает все дополнительные значения после нажатия кнопки Killкнопка.Я понимаю, что я должен поместить свои вычисления в другой поток, но я не уверен, как бы я это сделал для операций обработки событий.Например, у меня есть

protected void onResume() 
    {
        super.onResume();
        sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_FASTEST);
        sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_FASTEST);
    }

и onStop (), а также функции onSensorChanged () и onAccuracyChanged (), которые выполняются при срабатывании события.На самом деле, основные «тяжелые» вычисления находятся в моем onSensorChanged (), где я записываю значения на SD-карту, что, вероятно, вызывает задержку.Но я не могу поместить его в другой поток, потому что тогда он создаст МНОГО потоков, так как события будут продолжаться.

Так как мне сделать эту систему более отзывчивой?Я действительно новичок в Android, и некоторая помощь с помощью некоторого примера кода будет с благодарностью.

Спасибо всем!

РЕДАКТИРОВАТЬ: Могу ли я заставить поток реализовать интерфейс, такой как SensorEventListenerа затем включить OnResume и OnStop в этом потоке?

Ответы [ 2 ]

1 голос
/ 31 мая 2011

Мне также нравится получать датчики в другой теме.Для этого я создал HandlerThread при передаче контекста для менеджеров:

public class SensorDataThread extends HandlerThread implements Handler.Callback{

    private Handler mThreadHandler;
    private SensorManager mSensorManager;

    private SensorDataThread(Context ctx) {
        super("SensorDataThread", android.os.Process.THREAD_PRIORITY_BACKGROUND);
        mSensorManager = (SensorManager)ctx.getSystemService(Context.SENSOR_SERVICE);
    }

    public synchronized void start(){
        super.start();
        mThreadHandler = new Handler(getLooper(), this);
    }            

    public boolean handleMessage(Message msg)...
}

, затем я зарегистрировал объект Handler на его Looper после его запуска:

SensorDataThread sdt = new SensorDataThread(this);
sdt.start():

с этого момента у нас есть новый поток, который мы можем отправлять сообщения через его обработчик.

хитрость в том, чтобы теперь использовать SensorManager.registerListener() с объектом-обработчиком, в котором вычисляются данные.

 mSensorManager.registerListener([listener], [type], [delay], mThreadHandler);

из этого интерфейса (который может быть реализован самим SensorThread) вы просто передаете SensorEvents или что-либо еще в ThreadHandler.

public void onSensorChanged(SensorEvent event) {
    mThreadHandler.obtainMessage(MSG_SENSOR_EVENT, event)
    .sendToTarget();    
}

убедитесь, что вы либо отменили регистрацию слушателей, либо остановили поток, вызвав sdt.quit (), иначе он разрядит вашу батарею.

0 голосов
/ 05 марта 2011

Вы можете поставить в очередь кучу изменений датчика в памяти, а затем записывать только на SD-карту, когда вы достигаете определенного объема данных или пользователь нажимает кнопку. Сокращение количества раз записи на SD-карту, вероятно, сделает ее более отзывчивой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...