Android, showProgress () и hideProgress () правильно - PullRequest
0 голосов
/ 16 января 2020

Я новичок в разработке android, поэтому решил изучить простой вход в систему с использованием архитектурного шаблона MVP, в целом все работает нормально, как проверка учетных данных пользователя, вызов репозитория ... et c.

Однако, только реализации 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;
    }

}

Ответы [ 3 ]

1 голос
/ 20 января 2020

Спасибо h4rd4r7c0r3 и Ионуту Дж. Бежану за то, что он выделил несколько аспектов, в которых я не особо нуждался, в частности Рабочая нить (UI THREAD) и другая нить (Background Thread).

Хотя я пока не знаю, как их очень хорошо реализовать, я нашел путь после поиска по inte rnet.

Основные сценарии:

  1. Когда пользователь вводит имя пользователя и пароль, пользовательский интерфейс должен отображать индикацию (индикатор выполнения), проверяющую учетные данные пользователя, реализуя showProgress().
  2. Когда проверка завершена, пользовательский интерфейс должен остановить индикацию. реализация hideProgress().
  3. Действие, которое необходимо выполнить на основе результата, например: перейти к новой операции или всплывающее окно «Неверное имя пользователя / пароль».

// 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);
}
0 голосов
/ 27 февраля 2020

В вашем представлении просто запустите Presenter в другом потоке. Смотрите ваш хендлер. Затем он обновляет представление и не может получить доступ к пользовательскому интерфейсу. Чтобы это исправить, просто убедитесь, что ваш showProgress () работает с потоком пользовательского интерфейса.

runOnUiThread(new Runnable() {
    public void run() {
        //show your proress here.
    }
});
0 голосов
/ 16 января 2020

Попробуйте следующий фрагмент:

Шаг 1: - Создание расширения BaseActivity для AppCompactActivity

Шаг 2: - Установка BaseActivity согласно вашему требованию

Шаг 3: - Создание Экземпляр вашего Progress Dialog

Шаг 4: -Создайте функцию showProgress ()

Как: -

private fun showProgress(){
if(!progress.isShowing){
progress.show()
}
}

Шаг 5: - Создайте функцию HideProgress ()

Как: -

private fun hideProgress(){
    if(progress.isShowing){
    progress.dismiss()
    }
    }

И использовать согласно вашему требованию.

...