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

알고리즘질문(코드추가)................

0 추천

예를 들어 0부터10까지 버튼을 눌러 카운트를 합니다. 10이 되면 0으로 다시 돌아갑니다. 만약 0부터 시작해 버튼을 2번 눌렀다면 2가 됩니다.

맨아래 count는 onCreate()위에  int count = 0; 으로 선언되어 있습니다.  

앱을 종료하지 않으면 카운트가 잘되고 10이 된다면 다시 0으로 돌아갑니다. 문제는 앱을 종료하면 일어납니다.  sharedPreferences에 저장할 변수가  onCreate()위에  int count = 0; 으로 선언되어 있어서 앱을 다시 시작하면 sharedPreferences에 저장된 마지막 변수가 아닌 0부터 카운트를 합니다. 

앱을 다시 실행해도 sharedPreferences에 저장된 변수부터 카운트를 하고싶습니다.

도와주세요.......

아래 코드는 에디트값을 orderinfo에 넣고 파이어베이스에 info와 카운트한 info(0~10) 를 저장하는 코드입니다.

btnInput.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        data1=edtData1.getText().toString();
        data2=edtData2.getText().toString();
        data3=edtData3.getText().toString();
        data4=edtData4.getText().toString();
        String orderInfo;
        orderInfo = data1+"&"+data2+"&"+data3+"&"+data4;

        int acount;

                if(acount==11){
                    acount=0;
                }
        String info = "info";
        String strCount = String.valueOf(acount);
        String infoCount = info+ strCount;
        user.clear();
        user.put("orderinfo",orderInfo);

        db.collection("order").document(infoCount)
                .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();
                    }
                });
        db.collection("order").document(info)
                .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();
                    }
                });
        SharedPreferences shareCount= getSharedPreferences("infoCount", MODE_PRIVATE);
        SharedPreferences.Editor editorCount= shareCount.edit(); 
        editorCount.putString("counta", String.valueOf(count)); 
        editorCount.commit(); //저장

        SharedPreferences sharedData1= getSharedPreferences("infoCount", MODE_PRIVATE);
        String inputText1 = sharedData1.getString("counta","");
        String recvCount = inputText1;
        acount=Integer.parseInt(recvCount);
        acount++;
        count=acount;
    }
});
개미1 (1,260 포인트) 님이 2021년 11월 8일 질문

1개의 답변

0 추천

님의 코드를 기반으로 약간의 수정을 해봤습니다. 긴 로직은 잘게 쪼개는 식으로.

그리고 문제가 되는 부분은 액티비티의 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();
    }
}

 

spark (227,930 포인트) 님이 2021년 11월 8일 답변
spark님이 2021년 11월 8일 수정
...