마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

SharePreferences 관련 질문입니다.

0 추천

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,

                         @Nullable Bundle savedInstanceState) {
    FrameLayout layout = (FrameLayout)inflater.inflate(R.layout.fragment_get_val2,

            container, false);

    Editsensor_Name[0] = (EditText) layout.findViewById(R.id.Editsensor1_Name);
    Editsensor_Name[1] = (EditText) layout.findViewById(R.id.Editsensor2_Name);
    Editsensor_Name[2] = (EditText) layout.findViewById(R.id.Editsensor3_Name);
    Editsensor_Name[3] = (EditText) layout.findViewById(R.id.Editsensor4_Name);
    Editsensor_Name[4] = (EditText) layout.findViewById(R.id.Editsensor5_Name);
    Editsensor_Name[5] = (EditText) layout.findViewById(R.id.Editsensor6_Name);
    Editsensor_Name[6] = (EditText) layout.findViewById(R.id.Editsensor7_Name);
    Editsensor_Name[7] = (EditText) layout.findViewById(R.id.Editsensor8_Name);
    for(int i = 0; i < Editsensor_Name.length; i++) {
        //getSharedPreferences Edittext저장
        SharedPreferences sf = this.getActivity().getSharedPreferences("sFile",MODE_PRIVATE);
        Editsensor_Name[i].setText(sf.getString(String.valueOf(i),""));

    }
    return layout;

}

@Override
public void onStop() {
    super.onStop();
    for(int i = 0; i < Editsensor_Name.length; i++) {
        // Activity가 종료되기 전에 저장한다.
        //SharedPreferences sFile이름, 기본모드로 설정
        SharedPreferences sharedPreferences = this.getActivity().getSharedPreferences("sFile", MODE_PRIVATE);

        //저장을 하기위해 editor를 이용하여 값을 저장시켜준다.
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString(String.valueOf(i),Editsensor_Name[i].getText().toString());
        // 사용자가 입력한 저장할 데이터
        editor.commit();
    }
}

이렇게 Edittext에 배열을 준 다음에 SharePreferences 를 이용하여 저장을 하려고하는데 아래의 사진처럼 가끔씩만 저장이 작동되고 대부분 저장기능이 잘 작동이 되지 않는데 뭐가 오류인지 알수있을까요??

ddaeany (180 포인트) 님이 2021년 4월 28일 질문
getSharedpreferences 쓰는게 맞긴해요!
그렇네요 ㅠㅠ....... 그러면, sf.setString()이 없어서 그런거 아닐까요? ㅎ
근데 이게 가끔씩은 저장이 되가지고 ㅠㅠ 혹시 생각하시는게 setText putstring 이거 말씀하시는걸까요?
제가 잘못봤네요. ㅠㅠ 죄송합니다.

1개의 답변

0 추천

SharedPreferences는 XML을 읽고 쓰는 I/O 작업이기 때문에 UI에 인터럽트를 줄 수 있으므로 메인쓰레드에서 하시지 말고 백그라운드 쓰레드에서 처리하세요.
아래코드는 해당 방향성과 관련한 샘플입니다. 테스트는 안해봤지만, I/O를 처리하는 부분과 UI 처리를 하는 부분을 분리했습니다.
그리고 I/O 작업은 백그라운드 쓰레드에서 처리했구요. 샘플코드에서 아이디어를 얻으셨으면 좋겠네요.

그리고 왜 현재 코드가 저장되었다 안되었다 하는지 디버깅을 통해 확인해 보세요.

public String FarmNote {
     // 필드 생략
    public String getId() {...}
    public String getContent() {...}
}

public interface FarmDeviceDao {
   void saveNotes(List<FarmNote> notes); 
   // 필요시 다른 메소드들 추가
}

public class FarmDeviceDaoImpl implements FarmDeviceDao {

    private final SharedPreferences sharedPreferences;
    public void FarmDeviceDaoImpl(SharedPreferences sharedPreferences;) {
        this.sharedPreferences = sharedPreferences;
    }

    private SharedPreferences.Edit edit() {
       return sharedPreferences.edit();
    }

   @Override
    public saveNotes(List<FarmNote> notes {
         final SharedPreferences.Edit edit = edit();
         for (FarmNote note : notes) {
              edit.putString(note.getId(), note.getContent())
          }                                        
          edit.apply();
    } 
}

public class SaveFarrmNotesUseCase {

    private final FarmDeviceDao dao:
    public  SaveFarrmNotesUseCase(FarmDeviceDao dao:) {
           this.dao = dao;
    }

    public void saveNotes(List<FarmNote> notes) {
         new Thread(new Runnable() {
                @Override
                 void run() {
                     dao.saveNotes(notes);
                 }
         }).execute();
          
    }
}


// Activity or Fragment
private SaveFarrmNotesUseCase saveFarmNotesUseCase;

// onCreate
SharedPreferences sf = this.getActivity().getSharedPreferences("sFile",MODE_PRIVATE)
saveFarmNotesUseCase = new SaveFarrmNotesUseCase(new FarmDeviceDaoImpl(sf));


@Override
public void onStop() {
    saveFarmNotes();
    super.onStop();
}

private void saveFarmNotes() {
    saveFarmNoteUseCase.saveNotes(getFarmNotes());
}

private void getFarmNotes(): List<FarmNote> {
   List<FarmNote> notes = new ArrayList<>();
   for(int i = 0; i < Editsensor_Name.length; i++) {
        notes.add(new FarmNote("Note" + i, Editsensor_Name[i].getText().toString()));
    }
    return notes;
}

 

EDIT: 참 소스를 보니  Fragment를 사용하셨네요. Fragment는 Activity 와는 다르게  홈버튼을 누를 때 onStart/onStop이 동작합니다. 다른 프레그먼트 등으로 이동을 할 때는 발생하지 않아요. 이 부분도 확인해 보세요.

spark (224,800 포인트) 님이 2021년 4월 28일 답변
spark님이 2021년 4월 28일 수정
...