Bu benim soruya bir takip olduğunu: Android thread runnable performanceAndroid senkronize edildiSensorChanged?
ben uygulamam için etrafında senkronize yöntemler başım sarma bazı zorluk yaşıyorum
ben taramayı sensörleri ve diziler içine sensör değerlerini saklamak kalsam onlar
float[] accelerometerMatrix = new float[3];
float[] accelerometerWorldMatrix = new float[3];
float[] gyroscopeMatrix = new float[3];
float[] gravityMatrix = new float[3];
float[] magneticMatrix = new float[3];
float[] rotationMatrix = new float[9];
class InsertHandler implements Runnable {
public void run() {
//get values from arrays and insert into db
}
}
public void onSensorChanged(SensorEvent event) {
sensor = event.sensor;
int i = sensor.getType();
if (i == MainActivity.TYPE_ACCELEROMETER) {
accelerometerMatrix = event.values;
} else if (i == MainActivity.TYPE_GYROSCOPE) {
gyroscopeMatrix = event.values;
} else if (i == MainActivity.TYPE_GRAVITY) {
gravityMatrix = event.values;
} else if (i == MainActivity.TYPE_MAGNETIC) {
magneticMatrix = event.values;
}
long curTime = System.currentTimeMillis();
long diffTime = (curTime - lastUpdate);
// only allow one update every POLL_FREQUENCY.
if(diffTime > POLL_FREQUENCY) {
lastUpdate = curTime;
//insert into database in background thread
executor.execute(insertHandler);
}
}
Her 10ms değiştirmek benim uygulaması (dizilerden) geçerli sensör değerleri alır ve tek bir iplik vasisi kullanarak bir veritabanına bunları ekler. Yani onSensorChanged
yöntem iki dizide yazılı ve
Sorum, onSensorChanged
yöntem
En önemli şey, hiçbir veriyi kaçırmamam. Her 10 ms'de mevcut sensör değerlerini kaydetmem gerekiyor - hiçbiri kaçırılamaz.
Anlayışım gereği, senkronize edilmiş bir yöntem, UI iş parçacığının bir kilit tutacağı ve sensör değerlerini dizilere yazacağı anlamına gelir. Bu süre boyunca, yürütücü iplik kilidi nedeniyle bu dizilerden okuyamaz. Sonra kilit kaldırılır ve infaz iplik daha sonra kilitler, bültenleri
kilitlemek, dizilerden okur ve veritabanına yazma ÖzellikleonSensorChanged
olay sürülür verildi ve emin değilim, burada senkronize yöntemlerin kullanımını yanlış anlama olabilir
bunun nasıl oynandığı
Fakat böyle bir durumda, her 10 ms'de en son değerleri eklemiyor olabilirim. UI iş parçacığı bir kilit oluşturduğunda, yürütücü iş parçacığı bu değerleri veritabanına yazamaz. Yürütücü iş parçacığı yazabildiği zaman, değerler şimdi birkaç ms eski ve hatalı
Diğer taraftan, eşitleme, UI iş parçacığının dizi değerlerini değiştirdiği durumlara sahip olmamam anlamına gelir. Aynı anda, yürütücü iş parçacığı, yarım değiştirilen değerleri veritabanına eklenir
Bu nedenle, her 10 ms'de bir en son/doğru algılayıcı verisini eklemek zorunda olduğum bir durum için, senkronize bir yöntem kullanmalı mıyım?