닉네임을 서버에 저장하는 클래스를 하나 만드세요.
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 : 값을 서버에 저장, 서버 성공시 로컬값도 업데이트 하는 등의 처리.
..
}
}