Android MVVM存储库和ViewModel问题

问题描述

我刚刚开始我的MVVM模式。当我登录时,我遇到了一些问题。这是我的代码

1。登录服务

from tkinter import *
import sqlite3

root = Tk()
root.geometry("400x400")
root.maxsize(400,400)
root.title("Testing")

conn = sqlite3.connect(r'D:\Users\drmargis\Python Projects\Projects\GeNamenator\GeName_DB_2.db')
curs = conn.cursor()

curs.execute(""" SELECT * FROM themes """)
theme_list = curs.fetchone()
main_bg = theme_list[1]
button_bg = theme_list[2]
button_act_bg = theme_list[3]
frame_bg = theme_list[4]
text_color = theme_list[5]
entry_bg = theme_list[6]

root.configure(bg=main_bg)


def theme_green():
    main_bg = "#66cc99"
    button_bg = "#66cc00"
    button_act_bg = "#0b5345"
    frame_bg = "#66cc33"
    text_color = "#000000"
    entry_bg = "#ffffff"
    curs.execute(""" UPDATE themes SET main_bg=(?),button_bg=(?),button_act_bg=(?),frame_bg=(?),text_color=(?),entry_bg=(?) WHERE thm_id=1""",(main_bg,button_bg,button_act_bg,frame_bg,text_color,entry_bg,))
    conn.commit()


def theme_red():
    main_bg = "#c2240b"
    button_bg = "#ae1f1f"
    button_act_bg = "#5d0909"
    frame_bg = "#c13323"
    text_color = "#000000"
    entry_bg = "#ffffff"
    curs.execute(""" UPDATE themes SET main_bg=(?),))
    conn.commit()


change_but = Button(root,font=("Calibri",23,'bold'),text="Change Green",fg=text_color,bg=button_bg,activebackground=button_act_bg,command=theme_green)
change_but.grid(row=0,column=0)
change_but = Button(root,text="Change Red",command=theme_red)
change_but.grid(row=1,column=0)

root.mainloop()

2。存储库

public interface LoginService {
    @FormUrlEncoded
    @POST("user/login")
    Call<JsonObject> validateLogin(@Field("phoneNum") String phoneNum,@Field("password") String password);
}

3。视图模型

方法public class LoginRepository { private static final String TAG = "LoginRepository"; private static LoginRepository instance; public static LoginRepository getInstance() { if (instance == null) { instance = new LoginRepository(); } return instance; } public mutablelivedata<JsonObject> getLoginMessage(String phoneNum,String password) { final mutablelivedata<JsonObject> message = new mutablelivedata<>(); LoginService service = RetrofitClass.getLoginService(); Call<JsonObject> call = service.validateLogin(phoneNum,password); call.enqueue(new Callback<JsonObject>() { @Override public void onResponse(Call<JsonObject> call,Response<JsonObject> response) { if (response.isSuccessful()) { JsonObject info = response.body(); message.setValue(info); } } @Override public void onFailure(Call<JsonObject> call,Throwable t) { Log.d(TAG,"fail!"); message.setValue(null); } }); return message; } } 是使用phoneNum和密码请求登录服务的。当用户单击登录按钮时将使用它。

queryRepo

4。活动 login

public class Loginviewmodel extends viewmodel {
    private static final String TAG = "UserProfileviewmodel";

    private LoginRepository mLoginRepository;

    private mutablelivedata<JsonObject> message = new mutablelivedata<>();

    public void queryRepo(String phoneNum,String password) {
        this.message = mLoginRepository.getLoginMessage(phoneNum,password);
    }

    public LiveData<JsonObject> getMessage() {
        return message;
    }
}

我认为这很清楚,但是我真的不知道为什么它不起作用。当我触摸登录按钮时,public class LoginActivity extends AppCompatActivity implements View.OnClickListener { private static final String TAG = "LoginActivity"; private TextView mForgetPswTv,mRegisterTv; private EditText mPhoneEdt,mPasswordEdt; private QMUIRoundButton mLoginBtn; private ProgressBar mProgressBar; private Loginviewmodel mLoginviewmodel; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getSupportActionBar().hide(); setContentView(R.layout.activity_login); initView(); bindOperation(); mLoginviewmodel = new viewmodelProvider(this).get(Loginviewmodel.class); mLoginviewmodel.getMessage().observe(this,new Observer<JsonObject>() { @Override public void onChanged(JsonObject jsonObject) { if (jsonObject != null) { mProgressBar.setVisibility(View.GONE); mPasswordEdt.setText(jsonObject.toString()); } else Log.d(TAG,"null"); } }); } private void initView() { mProgressBar = (ProgressBar) findViewById(R.id.progress_circular_movie_article); mForgetPswTv = findViewById(R.id.forget_psw_tv);//忘记密码 mRegisterTv = findViewById(R.id.register_tv);//立即注册 mLoginBtn = findViewById(R.id.login_btn); mPhoneEdt = findViewById(R.id.phone_edt); mPasswordEdt = findViewById(R.id.password_edt); } private void bindOperation() { mForgetPswTv.setonClickListener(LoginActivity.this); mRegisterTv.setonClickListener(LoginActivity.this); mLoginBtn.setonClickListener(v -> { mLoginviewmodel.queryRepo(mPhoneEdt.getText().toString(),mPasswordEdt.getText().toString()); }); } } 将变为null。我错过了重要的事情吗? 实际上,如果我不初始化消息,则第一次调用queryRepo很好,但是一旦为消息分配了值,如果再次调用queryRepo,则message.getValue()将为null。

解决方法

我终于做到了,如下。

joblib.load()

再次感谢大家!

,

尝试像这样观察活动数据到Button OnClickListener中,并检查

 mLoginBtn.setOnClickListener(v -> {
            mLoginViewModel.queryRepo(mPhoneEdt.getText().toString(),mPasswordEdt.getText().toString());

            mLoginViewModel.getMessage().observe(this,new Observer<JsonObject>() {
            @Override
            public void onChanged(JsonObject jsonObject) {
                if (jsonObject != null) {
                    mProgressBar.setVisibility(View.GONE);
                    mPasswordEdt.setText(jsonObject.toString());
                } else Log.d(TAG,"null");
            }
       });
 });