2016-11-28 13 views
0

사용자의 단계 수를 저장하려고하지만 모바일을 다시 시작하거나 전원을 끄면 데이터가 사라집니다. SharedPreferences가 데이터를 저장하지 않습니다. 휴대 전화를 다시 시작한 후 앱에 들어가면 0이됩니다. 그것을 해결하는 방법?sharedPreferences가 데이터를 저장하지 않음

이 코드는 다음과 같습니다

package com.threemusketeers.healthmaster; 

import android.app.Activity; 
import android.app.Application; 
import android.content.Context; 
import android.content.SharedPreferences; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.preference.PreferenceManager; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.widget.TextView; 

public class Pedometer extends Activity implements SensorEventListener { 
private TextView textView; 

private SensorManager mSensorManager; 

private Sensor mStepCounterSensor; 

private Sensor mStepDetectorSensor; 

SharedPreferences sharedPreferences; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_pedometer); 
    textView = (TextView) findViewById(R.id.textview); 

    mSensorManager = (SensorManager) 
      getSystemService(Context.SENSOR_SERVICE); 
    mStepCounterSensor = mSensorManager 
      .getDefaultSensor(Sensor.TYPE_STEP_COUNTER); 
    mStepDetectorSensor = mSensorManager 
      .getDefaultSensor(Sensor.TYPE_STEP_DETECTOR); 
} 

public void onSensorChanged(SensorEvent event) { 
    sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
    SharedPreferences.Editor editor = sharedPreferences.edit(); 

    Sensor sensor = event.sensor; 
    float[] values = event.values; 
    int value = -1; 

    if (values.length > 0) { 
     value = (int) values[0]; 
    } 
    if (sensor.getType() == Sensor.TYPE_STEP_COUNTER) { 
     editor.putInt("steps", value).commit(); 
     textView.setText("Step Counter Detected : " + sharedPreferences.getInt("steps", 0)); 
    } else if (sensor.getType() == Sensor.TYPE_STEP_DETECTOR) { 
     // For test only. Only allowed value is 1.0 i.e. for step taken 
     editor.putInt("steps", value).commit(); 
     textView.setText("Step Detector Detected : " + sharedPreferences.getInt("steps", 0)); 
    } 
} 

    @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) { 

    } 

    protected void onResume() { 

     super.onResume(); 

     mSensorManager.registerListener(this, mStepCounterSensor, 

      SensorManager.SENSOR_DELAY_FASTEST); 
     mSensorManager.registerListener(this, mStepDetectorSensor, 

      SensorManager.SENSOR_DELAY_FASTEST); 

    } 

    protected void onStop() { 
     super.onStop(); 
     mSensorManager.unregisterListener(this, mStepCounterSensor); 
     mSensorManager.unregisterListener(this, mStepDetectorSensor); 
    } 
} 
+1

을 (); ' –

+0

나는 이미 그것을 불렀다 .. editor.putInt ("steps", value) .commit(); –

+0

아, 죄송합니다 ... 그걸 놓쳤습니다. –

답변

0

당신은 그 자체가 이상한 일을 할, 즉 unnecesarry IO 작업 인 다시 거기에서 그것을 얻을 다음 SharedPreferences에 값을 기록합니다.

스텝 카운터합니다 ( documentation에서) 마지막으로 재부팅

때문에 사용자 로 촬영 단계

당신의

수를 계산하기 때문에이 또한 문제가 발생

장치를 재부팅하면 카운트가 0으로 재설정됩니다. onCreate에서 TextView를 업데이트하지 않고 단계 수를 변경하면 (0에서 1로) 덮어 씁니다 이전 값을 SharedPreferences에 저장하고 거기에서 TextView 값을 업데이트하십시오.

sharedprefs에서 값을 먼저 읽도록 저장 논리를 변경하고 현재 단계 수가 저장된 값보다 낮 으면이를 기본 값으로 추가해야합니다. 또는 단계 탐지기로 단계를 직접 계산하십시오.

+0

고맙습니다 ..... 내 앱이 실행되고 있지는 않지만 어떻게 단계 카운터가 내 단계를 계산할 수 있는지 말해 줄 수 있습니까? 앱은 앱이 실행 중일 때만 단계를 계산합니다. –

0

아래에 언급 한 것처럼 된 SharedPreferences를 사용해보십시오 :

SharedPreferences prefs = getSharedPreferences("my_prefs", MODE_PRIVATE); 
Editor editor = prefs.edit(); 
editor.putString("name", "Ravish"); 
editor.commit(); 

가 데이터를 검색하려면 :

데이터 저장하려면 당신은 또한 editor.commit`호출 할 필요가

SharedPreferences prefs = getSharedPreferences("my_prefs", MODE_PRIVATE); 
String name= prefs.getString("name"); 
+0

감사합니다 .....하지만 모바일을 재부팅 할 때 각 단계마다 1 씩 증가하는 대신 큰 값으로 증가합니다 –

관련 문제