Android,showProgress()和hideProgress()正常

问题描述 投票:0回答:2

我是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;
    }

}
android mvp android-mvp
2个回答
0
投票

请在下面的代码段中尝试这个:

步骤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()
    }
    }

并根据您的要求使用。


0
投票

由于h4rd4r7c0r3]和Ionut J. Bejan,为了突出显示我并不是很了解的几个方面,特别是工作线程(UI THREAD)和另一个线程(背景线程)。

尽管我还不知道如何很好地实现它们,但我在搜索互联网后找到了方法。

主要方案是:

  1. [当用户输入用户名和密码时,UI应显示指示(进度条)检查用户的凭据,实施showProgress()
  2. 检查完成后,UI应停止指示。执行hideProgress()
  3. 根据结果要执行的操作,例如:导航到新活动或吐司“错误的用户名/密码”。
  4. // 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);
}
© www.soinside.com 2019 - 2024. All rights reserved.