Мне нужно выполнить алгоритм динамического переноса времени (DTW) с некоторыми ранее сохраненными данными и данными акселерометра. Но я не могу обрабатывать огромное количество данных, поступающих с акселерометра. Мне нужно определить шаг. Для этого я предварительно сохранил ряд данных и пытаюсь сопоставить их с текущими данными.
ArrayList<Double> test=new ArrayList<Double>();
public void onSensorChanged(SensorEvent event) {
double x=event.value[0];
double y=event.value[1];
double z=event.value[2];
double a=Math.sqrt(x*x+y*y+z*z);
test.add(a);
new ProgressRunner().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,x);
private class ProgressRunner extends AsyncTask<Double, Integer, Boolean>
{
@Override
protected Boolean doInBackground(Double... params) {
new Thread(new Runnable() {
@Override
public void run() {
double r=DTWDistance(StepSamples.sample1, standTest);
if(r<700) /* "Step Detected */
}
}).start();
return null;
}
Но я получаю огромные данные от датчика. Мой вопрос в том, как мне обрабатывать эти данные и постоянно сопоставлять их с образцами данных. Также я тестировал с помощью Log.d, я уверен, что проблема связана с тем, как я обрабатываю эти Live-данные, но я не могу найти выхода. Любое предложение будет полезно.
Я также пробовал это, делая это с интервалом в 2 секунды, но OutOfMemeoryBoundsException выбрасывает
if((System.currentTimeMillis()-sTime)/1000>2){
new ProgressRunner().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,x);
}
2 ответа
Одним из решений этой проблемы является сохранение порогового значения для изменения значений датчика. Если изменение в deltaX
, deltaY
, deltaZ
больше, то вы можете запустить AsyncTask, иначе не делайте этого.
Поскольку u не сохраняет никаких пороговых значений, количество создаваемых вами потоков очень велико.
ИЗМЕНИТЬ 1:
Вот ссылка на небольшой учебник, который поможет вам начать ... в этой ссылке он использовал временной интервал и порог для встряхивания устройства ... держу пари, что это идеальное решение для ваших требований
Вам нужно обрабатывать каждое отдельное значение или вы обрабатываете каждые x (например, 0,1) секунды? Я вызываю метод, который проверяет «сейчас - lastProcessedTime». Если это значение> 100 мс, я обработаю данные и обновлю lastProcessedTime = now. Если нет - выкину значение датчика.
Похожие вопросы
Новые вопросы
android
Android — это мобильная операционная система Google, используемая для программирования или разработки цифровых устройств (смартфонов, планшетов, автомобилей, телевизоров, одежды, очков, IoT). Для тем, связанных с Android, используйте теги, специфичные для Android, такие как android-intent, android-activity, android-adapter и т. д. Для вопросов, отличных от разработки или программирования, но связанных с Android framework, используйте эту ссылку: https://android .stackexchange.com.