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

     2023-02-19     208

关键词:

【中文标题】Retrofit 2 - 如何异步显示进度条?【英文标题】:Retrofit 2 - How show progress bar async? 【发布时间】:2016-12-24 02:16:38 【问题描述】:

我在 Android 中创建新项目时创建了默认登录活动。 默认情况下会创建一个progressBar,可以很好地登录并正确显示。这一切都是通过 AsyncTask 实现的。

现在我使用 Retrofit 2 让路异步登录。

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

    ....
    ....
    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 帧!应用程序可能在 ITS 主线程上做了太多工作。

如何解决?

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

谢谢

【问题讨论】:

你不应该在 UI 线程上调用 Thread.sleep() mmmm.... oki... 但是:从那以后我模拟请求需要几秒钟?这样才能保证进度条显示出来?另外,我认为使用 Retrofit 2 进行调用,所以 Async,会喜欢 AsyncTask。 我认为问题在于您的 showProgress 实现或该调用执行速度如此之快,并且您看不到进度条,因为它立即显示/隐藏。如果您添加延迟而不是睡眠(处理程序帖子),您将看到一个进度条。 感谢@Beloo,调用执行速度如此之快...... O_o。我尝试使用 hadlet post 添加延迟,效果很好 【参考方案1】:

让我与您分享由 Android Studio 创建的默认登录活动的代码实现和我的 Retrofit 实现。默认登录活动,包括AsyncTask,它称为UserLoginTask,在其中,我做了所有登录逻辑的东西。我使用.execute 而不是.enqueue,因为它是同步的,我们不需要AsyncTask 中的新线程

public class UserLoginTask extends AsyncTask<Void, Void, Boolean> 

        private final String mEmail;
        private final String mPassword;

        UserLoginTask(String email, String password) 
            mEmail = email;
            mPassword = password;
        

        @Override
        protected Boolean doInBackground(Void... params) 
            Retrofit restAdapter = new Retrofit.Builder()
                    .baseUrl(Constants.ROOT_API_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
            IConstructSecureAPI service = restAdapter.create(IConstructSecureAPI.class);
            Call<JsonElement> result = service.getToken(mEmail, mPassword, "password");
            try 
                //using sync request and get response 
                JsonElement element = result.execute().body();
                if(element!=null) 
                    //do whatever you want with your response
                
             catch (IOException e) 
                e.printStackTrace();
                return false;
            
            return true;
        

        @Override
        protected void onPostExecute(final Boolean success) 
            mAuthTask = null;
            showProgress(false);

            if (success) 
                if(clientType != 2)
                    mPasswordView.setError(getString(R.string.error_incorrect_password));
                    mPasswordView.requestFocus();
                    clientType = 0;
                
                else 
                    Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                    startActivityForResult(intent, 1);
                
//                finish();
             else 
                mPasswordView.setError(getString(R.string.error_incorrect_password));
                mPasswordView.requestFocus();
            
        

        @Override
        protected void onCancelled() 
            mAuthTask = null;
            showProgress(false);
        

    

【讨论】:

感谢您的代码。在我的一项测试中,我做到了。但我有一个问题:我们想使用 Rretrofit 2 Sync 和 AsyncTask 的原因是什么,可以使用 Retrofit 2 Async 吗?谢谢 @daicon 当然可以,但是在您的问题中,我没有看到您所有的活动代码。我也不明白你写了什么 sleep 。一般来说,你的问题对我来说不是很清楚,你是否有改造问题或 UI 的一些异常,或者只是看到警告“ITS 主线程上的工作太多”?【参考方案2】:

无耻宣传

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

你可以这样做:

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

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

不过,您需要在 RxJava 中使用 retrofit2。

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

您可以通过GitHub page了解更多信息。

【讨论】:

当片段视图加载是异步任务的一部分时,如何在片段加载之前显示进度条?

】当片段视图加载是异步任务的一部分时,如何在片段加载之前显示进度条?【英文标题】:Howtoshowprogressbarbeforefragmentloadingwhenfragmentviewloadingispartofasynctask?【发布时间】:2018-04-1621:50:48【问题描述】:我有一个片段来显示日历... 查看详情

如何更新异步任务中的进度条

】如何更新异步任务中的进度条【英文标题】:HowtoupdateprogressbarinAsyncTask【发布时间】:2014-11-1607:46:40【问题描述】:我正在为android构建一个简单的备份应用程序,此代码读取手机内存中的所有消息并将其存储到一个csv文件中... 查看详情

如何使用界面更新异步任务中的进度条

】如何使用界面更新异步任务中的进度条【英文标题】:HowtoupdatetheProgressBarinAsyncTaskwithinterface【发布时间】:2017-11-2616:18:16【问题描述】:我创建了一个应用程序,其中我使用了Fragment类和另一个Async类来下载两个不同的类现在... 查看详情

异步上传,显示进度条

服务端代码[HttpPost]publicActionResultDoLoad(HttpPostedFileBaseupimage,stringtest){stringfilePhysicalPath=Server.MapPath("~/Upload/"+test);if(System.IO.File.Exists(filePhysicalPath)){System.IO.Streamupload 查看详情

在 Unity3D 中,如何在迭代 FileInfo[] 数组(非阻塞)时异步显示 UI 径向进度条?

】在Unity3D中,如何在迭代FileInfo[]数组(非阻塞)时异步显示UI径向进度条?【英文标题】:InUnity3D,howcanIasynchronouslydisplayaUIradialprogressbarwhileiteratingaFileInfo[]array(non-blocking)?【发布时间】:2020-11-0203:47:11【问题描述】:当我运行游... 查看详情

显示下载进度条

...想添加一个水平进度条来显示下载进度。但我面临错误。如何在不使用异步任务的情况下在此代码中添加进度条?privateclassExecutorServiceDownloadimplementsRunnableprivateStringurl;p 查看详情

u3d异步加载场景以及进度条的显示

1、先建立两个场景 2、把两个场景在在buildsetting中添加两个建好的两个场景3、在第一个场景中建立一个button和slider组件4、代码处理usingUnityEngine;usingSystem.Collections;usingUnityEngine.UI;usingUnityEngine.SceneManagement;publicclassButtonTest:Mo 查看详情

ios异步下载下载进度条显示

说到http异步下载,首先要知道其中的关键类。关键类是NSURLConnection  NSURLRequest NSMutableURLRequest 委托是NSURLConnectionDownloadDelegateNSURLConnectionDataDelegateNSURLConnectionDelegate首先,我们要实现最基本的下载功能。LQ 查看详情

ngui的异步场景加载进度条(代码片段)

 1、直接创建三个场景,其中第二个场景是用来显示进度条加载的界面,进度条用UISlider,不会的看我前面的博文就可以了。2、这里提供两种方法,建议使用第一种,加载比较平缓方法一: usingSystem.Collections;usingSystem.Colle... 查看详情

java示例代码_进度条仅在调试模式下显示。Job plus异步显示

java示例代码_进度条仅在调试模式下显示。Job plus异步显示 查看详情

如何使用 swift 显示带有进度条的 AVAudioPlayer?

】如何使用swift显示带有进度条的AVAudioPlayer?【英文标题】:HowtoAVAudioPlayerwithprogressbarshowusingswift?【发布时间】:2019-01-2413:26:17【问题描述】:我正在使用AVAudioPlayer播放歌曲。我需要一个进度条来显示歌曲的进度。我的问题是... 查看详情

retrofit2文件上传下载及其进度显示

序前面一篇文章介绍了Retrofit2的基本使用,这篇文章接着介绍使用Retrofit2实现文件上传和文件下载,以及上传下载过程中如何实现进度的显示。文件上传定义接口123@Multipart@POST("fileService")Call<User>uploadFile(@PartMultipartBody.Partfile... 查看详情

我如何在我的异步任务类中使用圆形旋转进度条

】我如何在我的异步任务类中使用圆形旋转进度条【英文标题】:Howicanusecircularspinningprogressbarinmyasynctaskclass【发布时间】:2019-06-0221:46:09【问题描述】:我想在asynctask类中使用旋转进度条。下面是我的asynctask类代码。在我使用... 查看详情

c#winform多线程异步委托进度条

求一个多线程异步委托实现进度条实时显示的代码示例。现在有一个按钮点击事件,点击按钮之后会对数据库进行进行访问获取数据,然后再对数据进行二次加工,之后再显示到DataGridView里面,这个过程时间比较长。我想让用户... 查看详情

如何在unity3d使用www加载场景并显示进度条

参考技术A异步加载场景,可以使用变量progress查看加载进度5.x:UnityEngine.SceneManagement.SceneManager.LoadSceneAsync("sceneName").progress;4.xApplication.LoadLevelAsync(1).progress;WWW通常使用在访问url时,www.progress可以查看加载进度 查看详情

在 AsyncTask 中显示进度条

...述】:我想在后台生成表格时显示一个圆形进度条。我在异步任务中的代码:classDoWorkextendsAsyncTask<Void,Void,Void>Contextcontext;publicDoWork(Contextcon)this.context=con;@O 查看详情

2015.3.11vs异步控件及进度条结合应用

1、在Form中添加指针控件:BackgroundWorker-bgwork;进度条控件progressBar1以及开始、取消按钮2、开始按钮启动异步线程privatevoidbutton1_Click(objectsender,EventArgse){  bgwork.WorkerReportsProgress=true;//允许异步控件报告状态  bgw 查看详情

Delphi:如何使用进度条显示 CreateProcess 的进度?

】Delphi:如何使用进度条显示CreateProcess的进度?【英文标题】:Delphi:HowtouseaprogressbartodisplaytheprogressofaCreateProcess?【发布时间】:2014-08-0818:24:23【问题描述】:我有一个Startandwait函数,它创建一个进程并等待结束。如何创建进度... 查看详情