Runnable заходит в бесконечный цикл в Android - PullRequest
0 голосов
/ 13 мая 2018

Я пытаюсь разработать активность входа в Android и использую следующий метод для входа в систему:

private void attemptLogin() {
    /*if (mAuthTask != null) {
        return;
    }*/

    // Reset errors.
    mEmailView.setError(null);
    mPasswordView.setError(null);

    // Store values at the time of the login attempt.
    String email = mEmailView.getText().toString();
    String password = mPasswordView.getText().toString();

    boolean cancel = false;
    View focusView = null;

    // Check for a valid password, if the user entered one.
    if (!TextUtils.isEmpty(password) && !isPasswordValid(password)) {
        mPasswordView.setError(getString(R.string.error_invalid_password));
        focusView = mPasswordView;
        cancel = true;
    }

    // Check for a valid email address.
    if (TextUtils.isEmpty(email)) {
        mEmailView.setError(getString(R.string.error_field_required));
        focusView = mEmailView;
        cancel = true;
    } else if (!isEmailValid(email)) {
        mEmailView.setError(getString(R.string.error_invalid_email));
        focusView = mEmailView;
        cancel = true;
    }

    if (cancel) {
        // There was an error; don't attempt login and focus the first
        // form field with an error.
        focusView.requestFocus();
    } else {
        // Show a progress spinner, and kick off a background task to
        // perform the user login attempt.
        showProgress(true);
        RetrofitAPIService retrofitAPIService = RetrofitAPIService.aRetrofitApiService();
        final Handler handler = new Handler();
        new Thread(new Runnable() {
            @Override
            public void run() {
                /*authService.login(email, password);*/
                UserAuthCommand userAuthCommand = new UserAuthCommand(email, password);
                UserProfile userProfile = retrofitAPIService.authorizeUser(userAuthCommand);
                Runnable runnable = new Runnable() {
                    @Override
                    public void run() {
                        if (userProfile != null) {
                            Intent intent = new Intent(getApplicationContext(), HomeActivity.class);
                            startActivity(intent);
                        } else {
                            Toast.makeText(getApplicationContext(), "Bad", Toast.LENGTH_SHORT).show();
                        }
                    }
                };
                LoginActivity.this.runOnUiThread(runnable);
               /* final Looper looper = Looper.myLooper();
                looper.quit();*/
            }
        }).start();
        //new UserLoginTask(email, password).execute((Void) null);
    }
}

Я вызываю этот метод, нажимая кнопку входа, переопределяя настройку setOnClickListener и переопределяя onClick ().

Моя проблема в том, что когда я ввожу неправильные учетные данные, на экране отображается тост, но бэкэнд заходит в бесконечный цикл. Я сделал некоторую отладку и похоже, что текущий поток переходит в метод loop () из Looper.class.

Кто-нибудь может мне помочь? Огромное спасибо!

1 Ответ

0 голосов
/ 13 мая 2018

Я рекомендую вам использовать AsyncTask, который автоматически управляет потоками и обратными вызовами.

Например

private class LoginTask extends AsyncTask<ParamsType, ProgressType, ResultType> {
 protected ResultType doInBackground(ParamsType... params) {
     // This method runs in a background thread
     return result;
 }

 protected void onPostExecute(ResultType result) {
     // This method runs in UiThread
 }
}

Поместите свою логику входа в систему в метод doInBackground(), а логику результата - в onPostExecute(). И запустить его с:

new LoginTask().execute(params);

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...