Retrofit 2 - 如何显示进度条异步?

时间:2016-08-17 12:13:25

标签: android asynchronous retrofit progress

我在Android中创建新项目时创建了默认登录活动。 默认情况下,创建一个可以正常登录和显示的progressBar。所有这一切都通过AsyncTask实现。

现在我使用Retrofit 2让Async登录。

当我按下按钮登录时,启动了一个内容:

的方法
    ....
    ....
    showProgress(true);
    call.enqueue(new Callback<User>() {

        @Override
        public void onResponse(Call<User> call, retrofit2.Response<User> response) {

            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            User userdatos = response.body();

                if(userdatos != null){
                    // redirect to Main Activity page
                    showProgress(false);
                    Intent i = new Intent(LoginActivity.this, MainActivity.class);
                    startActivity(i);
                }
                else{
                    showProgress(false);
                    mPasswordView.setError(getString(R.string.error_incorrect_password));
                    mPasswordView.requestFocus();
                }
        }
        @Override
        public void onFailure(Call<User> call, Throwable t) {
            call.cancel();
            showProgress(false);
            Toast.makeText(LoginActivity.this, "Please check your network connection and internet permission", Toast.LENGTH_LONG).show();
        }
    });

我强制使用Thread.sleep(3000)进行检查。 没有进度条,调试显示: 跳过180帧!应用程序可能在IT​​S主线程上做了太多工作。

如何解决这个问题?

我会有很多异步调用,我总是会显示一个进度条,等待响应完成。

谢谢

2 个答案:

答案 0 :(得分:0)

让我与您分享Android Studio和我的Retrofit实现创建的默认登录活动的代码实现。默认登录活动,包括调用AsyncTask的{​​{1}},在其中,我完成了所有登录逻辑工作。我使用的是UserLoginTask而不是.execute,因为它是同步的,我们不需要.enqueue内的新线程

AsyncTask

答案 1 :(得分:0)

无耻推广

我为此创建了RxLoading library,它可以做到这一点以及更多,

你可以做这样的事情:

networkCall().compose(RxLoading.<>create(loadingLayout)).subscribe(...);

它由2个类组成,一个自定义视图(loadingLayout)和一个将transformer粘合在一起的RxLoading,您可以选择使用它们中的任何一个或两个。

你需要在rxJava中使用retrofit2。

RxLoading还支持空状态和错误状态(内置重试机制,因此请务必检查此选项)

您可以在GitHub page上找到更多信息。