gpt4 book ai didi

Java android SensorEventListener 中的 OutOfMemoryError

转载 作者:行者123 更新时间:2023-12-02 12:55:11 27 4
gpt4 key购买 nike

我在实现 SensorEventListener 的类中出现 OutOfMemoryError。在日志中有时我会遇到 OutOfMemoryError

@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
gravity = event.values;
}
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
geomagnetic = event.values;
}
if (gravity != null && geomagnetic != null) {
float R[] = new float[9];
float I[] = new float[9];
boolean success = SensorManager.getRotationMatrix(R, I, gravity, geomagnetic);
if (success) {
float orientation[] = new float[3];
SensorManager.getOrientation(R, orientation);
float azimuthInRadians = orientation[0];
float azimuthInDegress = (float)Math.toDegrees(azimuthInRadians);
if (azimuthInDegress < 0.0f) {
azimuthInDegress += 360.0f;
}
azimuth = (int) azimuthInDegress;
Hawk.put(HawkConst.AZIMUTH, azimuth);
}
}
}

这是我的日志。有时我会遇到此错误,但并非总是如此

  at com.android.internal.util.FastXmlSerializer.<init>(FastXmlSerializer.java:55)
at com.android.internal.util.XmlUtils.writeMapXml(XmlUtils.java:177)
at android.app.SharedPreferencesImpl.writeToFile(SharedPreferencesImpl.java:596)
at android.app.SharedPreferencesImpl.access$800(SharedPreferencesImpl.java:52)
at android.app.SharedPreferencesImpl$2.run(SharedPreferencesImpl.java:511)
at android.app.SharedPreferencesImpl.enqueueDiskWrite(SharedPreferencesImpl.java:532)
at android.app.SharedPreferencesImpl.access$100(SharedPreferencesImpl.java:52)
at android.app.SharedPreferencesImpl$EditorImpl.commit(SharedPreferencesImpl.java:454)
at com.orhanobut.hawk.SharedPreferencesStorage.put(SharedPreferencesStorage.java:23)
at com.orhanobut.hawk.Hawk.put(Hawk.java:63)
at pl.***.****.worker.Tracker.onSensorChanged(Tracker.java:154)
at android.hardware.SystemSensorManager$SensorEventQueue.dispatchSensorEvent(SystemSensorManager.java:474)
at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
at android.os.MessageQueue.next(MessageQueue.java:138)
at android.os.Looper.loop(Looper.java:131)
at android.app.ActivityThread.main(ActivityThread.java:5593)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
at dalvik.system.NativeStart.main(NativeStart.java)

最佳答案

您似乎在 onSensorChanged() 回调中做了一些繁重的工作。因此,在您的回调中,您正在调用 SharedPreferences。它不好的原因是每次传感器有新值时都会调用 onSensorChanged() ,根据您的监听器配置,这可能会每秒发生多次。这意味着您尝试每秒多次保存到文件(使用共享首选项)。这需要在 andorid 方面进行大量分配,并可能导致 OutOfMemoryError。

为了解决这个问题,我建议将值存储在变量中,并且仅以恒定的时间间隔或基于某些事件(按钮单击、生命周期事件等)执行保存。

我还看到您正在使用 .commit() ,它会阻塞线程直到保存文件,您可以尝试使用 .apply() ,它将提交操作移动到其他线程。不管怎样,您都需要限制使用共享首选项的次数。

关于Java android SensorEventListener 中的 OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44452348/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com