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

앱 내부 전역으로 사용되는 변수

0 추천
설정activity, mainActivity 가 있고 설정activity에서 닉네임 변경을 해주었을 때 서버에 저장되는 닉네임 값이 바뀐다면 mainActivity의 닉네임도 변경되도록 하고 싶습니다. 두 액티비티가 같은 viewmodel을 공유할 수 없다고 알고있고, application 위치에 observable한 변수도 선언할 수 없다고 알고 있습니다. 그렇다면 startActivityForResult()를 통해 설정이 닫힌 후 결과값으로 플래그를 만들어서 mainActivity를 새로고침 해주는 것이 최선의 방법일까요? 다른분은 어떻게 생각하시는지 궁금합니다.
want8607 (260 포인트) 님이 2022년 9월 3일 질문

1개의 답변

0 추천

닉네임을 서버에 저장하는 클래스를 하나 만드세요.

public class UserRepository {

    private String nicName;

    public String getNicName() {
        // TODO : 값을 서버에서 가져옴
        ...
    }

    public void saveNicName(String nicName) {
        // TODO : 값을 서버에 저장
        ..
    }
}

 

SettingsActivity 에서 UserReposiotry를 하나 생성하고 닉네임을 저장하세요.

public class SettingsActivity extends AppCompatActivity {

    private UserRepository userRepository;
    private EditText nickNameEdit;
    private Button saveButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        userRepository = new UserRepository();
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_settings);

        nickNameEdit = findViewById(R.id.nickNameEdit);
        saveButton = findViewById(R.id.saveButton);
        saveButton.setOnClickListener(v -> {
            saveUserNickName();
        });
    }

    private void saveUserNickName() {
        userRepository.saveNicName(nickNameEdit.getText().toString());
    }
}

 

MainActivity에서 서버에 저장된 값을 읽어와서 화면에 보여주세요.

public class MainActivity extends AppCompatActivity {

    private UserRepository userRepository;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        userRepository = new UserRepository();
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onStart() {
        super.onStart();
        displayUserNickName();
    }

    private void displayUserNickName() {
        String nickName = userRepository.getNicName();
        // nickNameText.setText(nickName);
    }
}

 

닉네임은 서버에 저장되기 때문에 MainActivity onStart에서 닉네임을 봉여주면 항상 업데이트된 이름이 보여지게 될 겁니다.

추가적으로 캐시 등의 기법을 사용하여 네트워크 호출을 줄이거나 사용자의 편의성을 높일 수도 있습니다. 이렇게 하려면 Application 클래스를 만들고 Repostiory를 하나만 생성(Singleton)하고 메모리나 파일 등에 닉네임을 캐시하면 됩니다. 또는 SharedPreferences와 같은  persistent storage를 사용하여 여기에 데이터를 가져와서 저장하고 읽어 오면 됩니다. 이렇게 하면 네트워크가 끊기거나 서버호출이 실패하더라도 캐시에 보관 중인 데이터를 보여줄 수 있습니다.

public class UserRepository {

     // 안드로이드에 종속적인 코드가 싫다면 SharedPreferences 대신에 인터페이스를 하나 선언해서 
     // 사용하면 됩니다.    
    private SharedPreferences storage;

    public UserRepository(SharedPreferences storage) {
          this.storage = storage;
    }
 
    public String getNicName() {
        if (shouldFetchNickName()) {
        String nickname = getRemoteNickName();
           storage.edit()
              .putString("nickname", nickname);
              .apply();
           return nickname;
         }
         return getLocalNickName();
    }

    private boolean shouldFetchNickName() {
          // TODO: 요구사항에 따라 다라짐 
           // 예를 들면, 로컬에 저장한 데이터가 일저 경과한 경우 true, 로컬에 저장한 데이터가 없을 때 등등 요구사항에 맞게 구현.
    }

   private String getLocalNickName() {
          return storage.getString('nickname", "");
   }
 
    public void saveNicName(String nicName) {
        // TODO : 값을 서버에 저장, 서버 성공시 로컬값도 업데이트 하는 등의 처리.
        ..
    }
}

 

spark (226,420 포인트) 님이 2022년 9월 3일 답변
spark님이 2022년 9월 3일 수정
...