님의 코드를 기반으로 약간의 수정을 해봤습니다. 긴 로직은 잘게 쪼개는 식으로.
그리고 문제가 되는 부분은 액티비티의 onCreat 에서 SharePreferences 를 읽어오고 onStop에서 저장하는 식으로 처리하면 해결 될 것으로 보입니다. 아래 코드를 참고하세요.
package com.spark.firestore.views;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.firestore.FirebaseFirestore;
import com.spark.firestore.R;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
private static final String PREFERENCES_NAME = "my_prefs";
private static final String KEY_COUNT_A = "counta";
private static final String ORDER_COLLECTION_NAME = "order";
private static final String DOC_INFO_KEY = "info";
private static final String ORDER_INFO_KEY = "orderinfo";
private static final int COUNT_THRESHOLD = 10;
private EditText edtData1, edtData2, edtData3, edtData4;
private Button btnInput;
private SharedPreferences preferences;
private int countA; //라 정확하게 어떤 용도인지를 몰라 변수이름을 대충 지었음. 용도에 맞는 좋은 변수명을 사용할 것.
private final Map<String, String> user = new HashMap<>();
private final FirebaseFirestore db = FirebaseFirestore.getInstance();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewDidLoad();
}
private void viewDidLoad() {
edtData1 = findViewById(R.id.edtData1);
edtData2 = findViewById(R.id.edtData2);
edtData3 = findViewById(R.id.edtData3);
edtData4 = findViewById(R.id.edtData4);
btnInput = findViewById(R.id.btnInput);
btnInput.setOnClickListener(v -> {
btnInputClicked();
});
loadCount();
}
private void loadCount() {
preferences = getSharedPreferences(PREFERENCES_NAME, MODE_PRIVATE);
countA = preferences.getInt(KEY_COUNT_A, 0);
}
private void btnInputClicked() {
if (countA > COUNT_THRESHOLD) {
countA = 0;
}
user.clear();
user.put(ORDER_INFO_KEY, getOrderInfoString());
saveUserToDB(getInfoCount());
observeDBChanges();
countA++;
}
@NonNull
private String getOrderInfoString() {
return String.format(
Locale.getDefault(),
"%s&%s&%s&%s",
edtData1.getText().toString(),
edtData2.getText().toString(),
edtData3.getText().toString(),
edtData4.getText().toString()
);
}
private void observeDBChanges() {
// FireStore 데이터 변경시 이벤트를 받기 위해 EventListener 추가.
// 이렇게 하는 것이 데이터는 Firestore에 저장된 것을 보여주어야 하기 때문에,
// 데이터와 화면의 동기화 측면에서 밑의 addOnSuccessListener를 사용하는 것보다 나은 접근방법으로 보임.
/*
db.collection(ORDER_COLLECTION_NAME)
.document(DOC_INFO_KEY)
.addSnapshotListener(new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(@Nullable DocumentSnapshot value, @Nullable FirebaseFirestoreException error) {
}
});
*/
db.collection(ORDER_COLLECTION_NAME)
.document(DOC_INFO_KEY)
.set(user)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void unused) {
Toast.makeText(getApplicationContext(), "성공", Toast.LENGTH_SHORT).show();
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(getApplicationContext(), "실패", Toast.LENGTH_SHORT).show();
}
});
}
private void saveUserToDB(String documentPath) {
db.collection(ORDER_COLLECTION_NAME)
.document(documentPath)
.set(user)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void unused) {
Toast.makeText(getApplicationContext(), "성공", Toast.LENGTH_SHORT).show();
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(getApplicationContext(), "실패", Toast.LENGTH_SHORT).show();
}
});
}
@NonNull
private String getInfoCount() {
return DOC_INFO_KEY + countA;
}
@Override
protected void onStop() {
super.onStop();
saveCount(countA);
}
private void saveCount(int count) {
SharedPreferences.Editor editorCount = preferences.edit();
editorCount.putInt(KEY_COUNT_A, count);
editorCount.apply();
}
}