我是android开发的新手,因此决定学习使用MVP架构模式进行简单登录,通常,一切正常,例如检查用户凭据,调用存储库...等
但是,至少对我来说,只有showProgress()和hideProgress()的实现以怪异的方式起作用。请注意,showProgress()
仅在用户具有有效凭据时才有效。
谢谢。
// Presenter Class
package com.example.mvp.login;
import android.util.Log;
import com.example.mvp.login.LoginContract;
import com.example.mvp.utils.SharedPrefManager;
public class LoginPresenterImpl implements LoginContract.Presenter{
SharedPrefManager sharedPrefManager;
private LoginContract.View view;
private LoginContract.Service service;
public LoginPresenterImpl(LoginContract.View view, LoginContract.Service service) {
this.view = view;
this.service = service;
sharedPrefManager = SharedPrefManager.getInstance(view.getContext());
}
@Override
public void onLoginClicked() {
String username = view.getUsername();
if (username.isEmpty()){
view.showUsernameError();
view.hideProgress();
return;
}
String password = view.getPassword();
if (password.isEmpty()){
view.showPasswordError();
view.hideProgress();
return;
}
view.showProgress(); // this method is called, but doesn't show in the UI Thread
boolean loginSucceeded = service.login(username, password);
if (loginSucceeded){
sharedPrefManager.userLogin(username);
view.navigateHome();
return;
}
view.hideProgress();
view.showLoginError();
}
@Override
public void isUserLoggedIn() {
if(sharedPrefManager.isLoggedIn())
view.navigateHome();
}
}
// View Class
public class LoginActivity extends AppCompatActivity implements LoginContract.View{
private EditText ed_username, ed_password;
private Button login;
private TextView signUp;
private ProgressBar progressBar;
LoginContract.Presenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
initView(this);
presenter = new LoginPresenterImpl(this, new LoignServiceImpl());
presenter.isUserLoggedIn();
login.setOnClickListener(click);
}
View.OnClickListener click = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.login:
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
presenter.onLoginClicked();
}
}, 1200);
}
}
};
public void initView(LoginActivity view){
ed_username = view.findViewById(R.id.username);
ed_password = view.findViewById(R.id.password);
login = view.findViewById(R.id.login);
signUp = view.findViewById(R.id.sign_up);
progressBar = view.findViewById(R.id.progressBar);
}
@Override
public String getUsername() {
return ed_username.getText().toString();
}
@Override
public String getPassword() {
return ed_password.getText().toString();
}
@Override
public void showProgress() {
progressBar.setVisibility(View.VISIBLE);
}
@Override
public void hideProgress() {
progressBar.setVisibility(View.GONE);
}
@Override
public void showUsernameError() {
ed_username.setError("Must not be empty");
}
@Override
public void showPasswordError() {
ed_password.setError("Must not be empty");
}
@Override
public void navigateHome() {
Intent intent = new Intent(this, HomeActivity.class);
startActivity(intent);
finish();
}
@Override
public void showLoginError() {
Toast.makeText(this,
"User not Found",
Toast.LENGTH_SHORT).show();
}
@Override
public Context getContext() {
return this;
}
}
请在下面的代码段中尝试这个:
步骤1:-创建BaseActivity扩展到AppCompactActivity
步骤2:-根据您的要求设置BaseActivity
步骤3:-创建进度对话框的实例
步骤4:-创建函数showProgress()
例如:-
private fun showProgress(){
if(!progress.isShowing){
progress.show()
}
}
步骤5:-创建函数HideProgress()
例如:-
private fun hideProgress(){
if(progress.isShowing){
progress.dismiss()
}
}
并根据您的要求使用。
由于h4rd4r7c0r3]和Ionut J. Bejan,为了突出显示我并不是很了解的几个方面,特别是工作线程(UI THREAD)和另一个线程(背景线程)。
尽管我还不知道如何很好地实现它们,但我在搜索互联网后找到了方法。
主要方案是:
showProgress()
。hideProgress()
。// LoginActivity
@Override public void showProgress() { progressBar.setVisibility(View.VISIBLE); } @Override public void hideProgress() { progressBar.setVisibility(View.GONE); }
// LoginPresenter
public void onLoginClicked() { String username = view.getUsername(); if (username.isEmpty()){ view.showUsernameError(); view.hideProgress(); return; } String password = view.getPassword(); if (password.isEmpty()){ view.showPasswordError(); view.hideProgress(); return; } view.showProgress(); service.login(username,password, this); } @Override public void isUserLoggedIn() { if(sharedPrefManager.isLoggedIn()) view.navigateHome(); } // implementing onFinished from FinishedListiner interface, to capture the result @Override public void onFinished(boolean bool) { view.hideProgress(); if (bool){ sharedPrefManager.userLogin(view.getUsername()); view.navigateHome(); return; } view.showLoginError(); }
//服务,它将连接到数据源
public class LoginServiceImpl implements LoginContract.Service {
UserRepository userRepository;
@Override
public void login(final String username, final String password, final FinishedListiner listener) {
userRepository = UserRepositoryImpl.getInstance();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// The method which will be used in the presenter class.
listener.onFinished(userRepository.checkUser(username, password));
}
}, 1200);
}