Создал сервис, который считывает показатели датчиков устройства, отправляет в обработчик(MagnetHelper), и в цикле отправляет обработанные данные по udp протоколу. Собственно, в сервис я это всё перенёс, т.к. в фоновом режиме данное дело, вполне предсказуемо - тормозит, пакеты отправляются где-то каждые 500мс, что неуместно. Но и после этого ничего не изменилось: пока приложение открыто - отправляется нормально, как только уходит в фон - появляется большая задержка.
import android.app.IntentService;
import android.content.Context;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
/**
* Created by Vyacheslav on 20.07.2018.
*/
public class ServiceSender extends IntentService implements SensorEventListener {
private SensorManager mSensorManager;
private Sensor mSensor;
private Sensor aSensor;
private MagnetHelper MG;
private MyPreferences Prefs;
private DatagramSocket socket;
private InetAddress address;
private String Port;
private boolean running = true;
public ServiceSender(String name) {
super(name);
}
public ServiceSender() {
super("ServiceSender");
}
@Override
public void onCreate() {
super.onCreate();
Prefs = new MyPreferences();
MG = new MagnetHelper(Prefs);
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
aSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(this, mSensor,
SensorManager.SENSOR_DELAY_NORMAL, SensorManager.SENSOR_DELAY_FASTEST);
mSensorManager.registerListener(this, aSensor,
SensorManager.SENSOR_DELAY_NORMAL, SensorManager.SENSOR_DELAY_FASTEST);
try {
socket = new DatagramSocket();
address = InetAddress.getByName("192.168.0.107");
Port = "4545";
}
catch(IOException e) {
Gdx.app.log("EXCEPTION", "Socket");
}
}
@Override
protected void onHandleIntent(Intent intent) {
double Axes[];
running = true;
while(running) {
Axes = MG.getAxes();
float Acc[] = MG.getAcc();
sendEcho(Acc[0], Acc[1], Acc[2], Axes[0], Axes[1], Axes[2]);
try {
Thread.sleep(50);
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
}
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
if(!Prefs.isLowPassFilter()) {
System.arraycopy(event.values, 0, MG.getmMagnetometerReading(),0, MG.getmMagnetometerReading().length);
} else {
MG.filterMagnet(event.values.clone());
}
}
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
if(!Prefs.isLowPassFilter()) {
System.arraycopy(event.values, 0, MG.getmAccelerometerReading(), 0, MG.getmAccelerometerReading().length);
} else {
MG.filterAcc(event.values.clone());
}
}
mSensorManager.getRotationMatrix(MG.getmRotationMatrix(), null,
MG.getmAccelerometerReading(), MG.getmMagnetometerReading());
}
public int sendEcho(double x, double y, double z, double yaw, double pitch, double roll) {
....
DatagramPacket packet
= new DatagramPacket(bb.array(), bb.array().length, address, Integer.parseInt(Port));
try {
socket.send(packet);
}
catch(IOException e) {
Gdx.app.log("EXEPTION", "Send");
}
return 0;
}
}
Ответ
Решение:
mSensorManager.registerListener(this, mSensor,
SensorManager.SENSOR_DELAY_FASTEST, SensorManager.SENSOR_DELAY_FASTEST);
mSensorManager.registerListener(this, aSensor,
SensorManager.SENSOR_DELAY_FASTEST, SensorManager.SENSOR_DELAY_FASTEST);
Комментариев нет:
Отправить комментарий