2017-06-09 12 views
0

私はSensorEventListenerを実装するクラスにOutOfMemoryErrorを持っています。ここでは、ログでは、時々私は、これは私が持っているログでOutOfMemoryErrorが発生SensorEventListenerのJava android 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) 
+0

stacktraceを含む例外を送信できますか? – Loyalar

+0

投稿したコードの行は154行ですか? – Loyalar

+0

@Loyalar Hawk.put(HawkConst.AZIMUTH、方位角); –

答えて

1

あなたのonSensorChanged()コールバックでは、いくつかの力仕事をしていると思われません。コールバックではSharedPreferencesを呼び出しています。それが悪い理由は、センサーから新しい値があるたびにonSensorChanged()が呼び出されるということです。これは、リスナーの設定に基づいて、毎秒複数回発生する可能性があります。これは、ファイルに(sharedpreferencesを使用して)1秒に複数回保存しようとしていることを意味します。これは物事の側面で多くの割り当てを必要とし、OutOfMemoryErrorが発生する可能性があります。

これを解決するには、変数に値を格納し、いくつかの一定の間隔で、またはいくつかのイベント(ボタンクリック、ライフサイクルイベントなど)に基づいて保存を実行することをお勧めします。

また、ファイルが保存されるまでスレッドをブロックする.commit()を使用していることがわかります。アクションを他のスレッドにコミットする.apply()を試してみることもできます。あなたがSharedpreferencesを何回使用しているか制限する必要はありません。

関連する問題