Страницы

Поиск по вопросам

пятница, 12 июля 2019 г.

Тормозит отправка данных сенсора в фоновом режиме

Создал сервис, который считывает показатели датчиков устройства, отправляет в обработчик(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);

Комментариев нет:

Отправить комментарий