为什么进度栏无法正常工作?

时间:2018-12-10 08:11:54

标签: android android-asynctask

我一直在构建具有登录功能的应用程序。我已经对其进行了测试,但是每次尝试登录时,进度条都会迅速消失(例如四分之一秒左右),并且从服务器收到的响应大约是进度条消失后约2秒。这是我的一些代码。

我的LoginTask内部类:

private class LoginTask extends AsyncTask<Account, Void, Account>{
        private String getUsername = username.getText().toString();
        private String getPassword = password.getText().toString();

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            //showDialog();
            progressBar.setVisibility(View.VISIBLE);
        }

        @Override
        protected void onPostExecute(Account account) {
            super.onPostExecute(account);
            //dismissDialog();
            progressBar.setVisibility(View.GONE);
        }

        @Override
        protected Account doInBackground(Account... accounts) {
            getLogin(getUsername, getPassword);
            return null;
        }
    }

登录到服务器的改造呼叫

private void getLogin(String email, String password) {
        Call<LoginAuth> call = userService.getLogin(email, password);
        call.enqueue(new Callback<LoginAuth>() {
            @Override
            public void onResponse(Call<LoginAuth> call, Response<LoginAuth> response) {
                try {
                    if (response.body().getToken_type().equals("xxx")) {
                        Log.i(TAG, "getLogin, Authorized access");
                        Log.i(TAG, "getLogin, access_token: " + response.body().getAccess_token().toString());
                        Log.i(TAG, "getLogin, expires_at" + response.body().getExpires_at().toString());
                    } else {
                        Log.e(TAG, "getLogin, Unauthorized access" + response.body().getToken_type().toString());
                    }
                } catch (Exception e) {
                    Log.e(TAG, "getLogin exception " + e.getMessage());
                }
            }

            @Override
            public void onFailure(Call<LoginAuth> call, Throwable t) {
                Log.e(TAG, "getLogin, onFailure : " + t.getMessage());
                new Handler(Looper.getMainLooper()).post(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(LoginActivity.this, "Unable to Log In :(", Toast.LENGTH_SHORT).show();
                    }
                });
            }
        });
    }

我希望它像获取响应时一样工作,那是进度条消失的时间(不是立即消失)。我的代码有问题吗?

1 个答案:

答案 0 :(得分:1)

在使用改造时,由于改造是异步管理的,因此无需在单独的asynctask中调用api。您应该做的是在调用api之前显示进度条,并分别在onResponseonFailure中关闭它。因此您的代码将变为如下所示。

private void getLogin(String email, String password) {
        progressBar.setVisibility(View.VISIBLE);
        Call<LoginAuth> call = userService.getLogin(email, password);
        call.enqueue(new Callback<LoginAuth>() {
            @Override
            public void onResponse(Call<LoginAuth> call, Response<LoginAuth> response) {
                progressBar.setVisibility(View.Gone);
                //rest of your code
            }

            @Override
            public void onFailure(Call<LoginAuth> call, Throwable t) {
                Log.e(TAG, "getLogin, onFailure : " + t.getMessage());
                progressBar.setVisibility(View.Gone);
                //rest of your code
            }
        });
    }