使用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时如何保持进度条状态?的主要内容,如果未能解决你的问题,请参考以下文章