我这个小程序使用MVVM的架构进行设计,并且使用单activity,多fragment的界面结构,使用ViewModel对于数据进行处理和保存。ViewModel可以在程序的生命周期中自动保存特定的数据,让我们可以在联网游戏或者本地保存游戏进度,不至于在返回桌面等操作之后出现数据丢失的情况。使用单activity,多fragment的结构,可以使界面的切换更加流畅(fragment是轻量化的activity),每个界面都是一个fragment类,其中包含了界面中有的UI,以及部分数据处理和逻辑的实现。在每一个fragment类里都初始化了ViewModel的实例,进行数据的处理。
下面我会展示我自己的ViewModel
public class MyViewModel extends AndroidViewModel {
//这些是需要用到的静态常量,可以看到还是挺多的,主要是为了储存。
SavedStateHandle handle;
public static final String KEY_HIGH_SCORE = "key_high_score";
public static final String KEY_LEFT_NUMBER = "key_left_number";
public static final String KEY_RIGHT_NUMBER = "key_right_number";
public static final String KEY_ANSWER = "key_answer";
public static final String KEY_OPERATOR = "key_operator";
public static final String KEY_NOW_SCORE = "key_now_score";
public static final String SAVED_SHP_DATA_NAME = "saved_shp_data_name";
public static final String KEY_IN_STRING = "key_in_string";
public static final String KEY_LOADING = "key_loading";
public static final String KEY_NAME = "key_name";
public static final String KEY_PASSWORD = "key_password";
public static final String KEY_CLIENT_INSTANCE = "key_client_instance";
public static final String KEY_PK_NAME = "key_pk_name";
public static final String KEY_MESSAGE = "key_message";
public static final String KEY_CONVERSATI0N = "key_conversation";
public static final String KEY_I_SCORE = "key_i_score";
public static final String KEY_HIS_SCORE = "key_his_score";
public static final String KEY_USER_ID = "key_user_id";
public static final String KEY_HISTORY = "key_history";
private AVIMClient client ;
private AVIMConversation conversation;
//下面开始就是大量方法
public boolean win_flag = false;
public MyViewModel(@NonNull Application application, SavedStateHandle handle) {
super(application);
if (!handle.contains(KEY_HIGH_SCORE)) {
SharedPreferences shp = getApplication().getSharedPreferences(SAVED_SHP_DATA_NAME, Context.MODE_PRIVATE);
handle.set(KEY_HIGH_SCORE,shp.getInt(KEY_HIGH_SCORE,0));
handle.set(KEY_LEFT_NUMBER,0);
handle.set(KEY_RIGHT_NUMBER,0);
handle.set(KEY_NOW_SCORE,0);
handle.set(KEY_OPERATOR,"+");
handle.set(KEY_ANSWER,0);
}
this.handle=handle;
}
public MutableLiveData<Integer>getLeftNumber(){
return handle.getLiveData(KEY_LEFT_NUMBER);
}
public MutableLiveData<Integer>getRightNumber(){
return handle.getLiveData(KEY_RIGHT_NUMBER);
}
public MutableLiveData<Integer>getHighScore(){
return handle.getLiveData(KEY_HIGH_SCORE);
}
public MutableLiveData<Integer>getCurrentScore(){
return handle.getLiveData(KEY_NOW_SCORE);
}
public MutableLiveData<Integer>getAnswer(){ return handle.getLiveData(KEY_ANSWER); }
public MutableLiveData<String>getOperator(){
return handle.getLiveData(KEY_OPERATOR);
}
public MutableLiveData<Integer>getLoading(){ return handle.getLiveData(KEY_LOADING); }
public void saveClientInstance(AVIMClient avuser){
this.client = avuser;
}
public AVIMClient getClientInstance(){
return this.client;
}
public void savePkName(String name){
handle.set(KEY_PK_NAME,name);
}
public String getPkName(){
return handle.get(KEY_PK_NAME);
}
public void saveConversation(AVIMConversation conversation){
this.conversation = conversation;
}
public AVIMConversation getConversation(){
return this.conversation;
}
public void saveIScore(String str){
handle.set(KEY_I_SCORE,str);
}
public String getIScore(){
return handle.get(KEY_I_SCORE);
}
public void saveHisScore(String str){
handle.set(KEY_HIS_SCORE,str);
}
public String getHisScore(){
return handle.get(KEY_HIS_SCORE);
}
public void saveUserId(String id){
handle.set(KEY_USER_ID,id);
}
public String getUserId(){
return handle.get(KEY_USER_ID);
}
public void randomCaculation() {
Random r = new Random();
String operator = "";
int left = 1 + r.nextInt(50);
int right = 1 + r.nextInt(50);
int answer = 0;
if (left > right) {
operator = "-";
answer = left-right;
} else {
operator = "+";
answer = left+right;
}
getLeftNumber().setValue(left);
getRightNumber().setValue(right);
getOperator().setValue(operator);
getAnswer().setValue(answer);
}
public void save(){
SharedPreferences shp = getApplication().getSharedPreferences(SAVED_SHP_DATA_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor edit = shp.edit();
edit.putInt(KEY_HIGH_SCORE,getHighScore().getValue());
edit.apply();
}
public void answerCorrect(){
getCurrentScore().setValue(getCurrentScore().getValue()+1);
if (getCurrentScore().getValue()>getHighScore().getValue()){
win_flag = true;
getHighScore().setValue(getCurrentScore().getValue());
}
randomCaculation();
}
public void fillInName(EditText editText){
SharedPreferences shp = getApplication().getSharedPreferences(SAVED_SHP_DATA_NAME, Context.MODE_PRIVATE);
if (!shp.getString(KEY_NAME,"").equals("")){
editText.setText(shp.getString(KEY_NAME,""));
}
}
public void fillInPass(EditText editText,Button button){
SharedPreferences shp = getApplication().getSharedPreferences(SAVED_SHP_DATA_NAME, Context.MODE_PRIVATE);
if (!shp.getString(KEY_NAME,"").equals("")){
editText.setText(shp.getString(KEY_PASSWORD,""));
button.callOnClick();
}
}
public void storeName(String name){
SharedPreferences shp = getApplication().getSharedPreferences(SAVED_SHP_DATA_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor edit = shp.edit();
edit.putString(KEY_NAME,name);
edit.apply();
}
public void storePass(String psd){
SharedPreferences shp = getApplication().getSharedPreferences(SAVED_SHP_DATA_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor edit = shp.edit();
edit.putString(KEY_PASSWORD,psd);
edit.apply();
}
public void clearName(){
SharedPreferences shp = getApplication().getSharedPreferences(SAVED_SHP_DATA_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor edit = shp.edit();
edit.putString(KEY_NAME,"");
edit.apply();
}
public void clearPassWord(){
SharedPreferences shp = getApplication().getSharedPreferences(SAVED_SHP_DATA_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor edit = shp.edit();
edit.putString(KEY_PASSWORD,"");
edit.apply();
}
public String getname(){
SharedPreferences shp = getApplication().getSharedPreferences(SAVED_SHP_DATA_NAME, Context.MODE_PRIVATE);
return shp.getString(KEY_NAME,"");
}
}