使用volley时如何保持进度条状态?

Posted

技术标签:

【中文标题】使用volley时如何保持进度条状态?【英文标题】:How to maintain progress bar state when using volley? 【发布时间】:2014-01-08 08:03:15 【问题描述】:

当我使用带有片段回调的 AysncTask 时,很容易保持进度条状态,但是我应该如何通过 volley 来实现呢?我不能使用 AsyncTask,因为它已经过时并且 volley 更好更快。 任何帮助或提示将不胜感激。

我正在使用 google 的 volley 发布和获取请求

【问题讨论】:

嗨@Rahul 你得到解决方案了吗? @Rahul,你找到更好的进度加载解决方案了吗? 不。我使用 configChanges 以便不重新创建活动 【参考方案1】:

我认为这里存在误解。

首先,Volley 比 AsyncTask 快。

这是比较苹果和橘子。他们都使用线程。 Volley 线程并不比异步任务中的线程快。队列是分开的,但仅此而已。在 API 11 及更高版本中,您可以将自己的线程池用于 AsyncTask 实例。

第二,定义得更好。

Volley 设计用于向服务器发送大量轻型有效载荷 (GET/POST) 并快速获得响应。然后调用者可以使用这些响应。

AsyncTask 旨在完成 UI 线程之外的给定任务,并提供有关该任务状态的各种回调。

对于您的ProgressBar,我假设您正在尝试确定正在执行的请求的进度。在 Volley 世界中,由于这些预计很小,因此您几乎有 3 个州。 Not Started、Executing(也包含开始解析)和Done(包括成功、错误和取消等)。如您所知,AsyncTask 在使用publishProgress 时有一个onProgress 的回调。因此,您的实例可以定义它想要发送的任何内容作为进度指示。

如果您的有效负载很大并且需要一些时间才能传输到服务器,那么 Volley 可能不合适。 Volley 在向服务器发送和从服务器发送大量有效负载方面做得并不好,甚至没有尝试做得很好。原因是这不是它的本意。就像它要求所有有效负载、上传和接收都可以完全放入内存中。因此,如果您有几个凌空请求,每个请求都有一个 1MB 的有效负载和一个 1MB 的响应,那么您会很快看到这些请求加起来。

Volley 是一个很棒的库,但请考虑一下它的推荐用途。阅读文档和代码实现了解更多信息。

如果您正在做一些需要相当长时间的事情,我会编写一个特定的请求类型来发送和流式传输内容。这样您就可以知道请求还剩下多少工作。我假设您使用发送和接收的字节数来衡量进度。

【讨论】:

我必须使用凌空抽射。这就像一个强制性的事情。问题在于用凌空保持进度条的状态。你能帮我解决这个问题吗 你在做什么?进度条代表什么?你用凌空发送/接收什么 对于简单的登录应用程序,我正在使用 volley。如果我使用异步,我可以在旋转屏幕时保持进度条状态,但如果是齐射,我该怎么做 嗯,没有什么说你不能以同样的方式做,对吧?只需保留对 volley 请求的引用并使用 getLastNonConfigurationInstance() 和所有这些,或者使用加载器包装您的请求并使用 Request Future。 今天甚至 google 都推荐使用 volley,您也可以将它用于昂贵的任务(无需网络访问的昂贵计算,就像您可以使用 asyncTask 一样)。【参考方案2】:

您可以在请求结束时执行的队列中添加一个监听器

            mRequestQueue.add(yourRequest);
            mRequestQueue.addRequestFinishedListener(new RequestQueue.RequestFinishedListener<String>() 
                @Override
                public void onRequestFinished(Request<String> request) 
                    if (progressDialog !=  null && progressDialog.isShowing())
                        progressDialog.dismiss();
                
            );

【讨论】:

更新答案,addRequestFinishedListener 现已弃用。【参考方案3】:

这是一个非常简单的修复。在你发出凌空请求之前,调用方法progress.show(),然后在你的响应中调用progress.dismiss() 就这样做了,效果很好!

【讨论】:

【参考方案4】:

很容易做到这一点..见下面的代码sn-p

sendJsonRequest()

     ///ENABLE PROGRESS BAR HERE
    enableProgressBar();        
    JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, URL, null,

    new Response.Listener<JSONObject>() 
    @Override
    public void onResponse(JSONObject response) 
         hideProgressDialog();  
         System.out.println(response);
     
    ,
    new Response.ErrorListener() 
    @Override
    public void onErrorResponse(VolleyError error) 
         hideProgressDialog();
    
    );
queue.add(jsObjRequest);


【讨论】:

进展如何?

以上是关于使用volley时如何保持进度条状态?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用仪表式进度条?

C# WinForm自定义进度条

ReactJS进度条使用状态动态更新?

使用axios加入进度条

VB.NET 中带有后台工作者的字幕进度条

如何在状态栏中对齐进度条?