当我使用带有片段回调的AysncTask时,很容易保持进度条状态,但是我应该如何用凌空来实现它?我可以使用AsyncTask因为它已经过时而且凌空更好更快。 任何帮助或提示都将不胜感激。
我使用谷歌的截击发布和获取请求
答案 0 :(得分:19)
我认为这里存在误解。
首先,Volley比AsyncTask更快。
这是比较苹果和橘子。他们都使用线程。 Volley线程并不比异步任务中的线程快。队列是分开的,但这是关于它的。在API 11&允许您使用自己的线程池来处理AsyncTask
个实例。
其次,更好地定义。
Volley旨在向服务器发送大量轻量级有效负载(GET / POST)并获得快速响应。然后呼叫者可以使用这些响应。
AsyncTask
旨在完成UI线程中的给定任务,并提供有关该任务状态的各种回调。
对于您的ProgressBar
我假设您正在尝试确定正在执行的请求的进度。在Volley世界中,因为预计它们很小,所以你有三个州。未开始,执行(也包含开始解析)和完成(包括成功,错误和取消等)。正如您所知AsyncTask
使用onProgress
时,publishProgress
会回调一下。因此,您的实例可以定义它想要发送的任何内容,作为进度的指示。
如果你的有效载荷很大并且需要时间转移到服务器,那么Volley可能不合适。 Volley并没有做得很好,甚至没有尝试在服务器上发送大量有效负载。原因是这不是它的意思。就像它需要所有有效载荷,上传和接收完全适合内存。所以,如果你有一些全面的截击请求,并且每个请求有1MB的有效负载和1MB的响应,你可以看到这很快就加起来了。
Volley是一个很棒的图书馆,但请考虑建议使用它。阅读代码的文档和实现以获取更多信息。
如果您正在做一些需要相当长时间的事情,我会写一个特定的请求类型来发送和传输内容。这样你就可以知道请求还剩下多少工作。我假设你使用发送和接收的字节作为进度的衡量标准。
答案 1 :(得分:6)
您可以将一个侦听器添加到请求结束时执行的队列
mRequestQueue.add(yourRequest);
mRequestQueue.addRequestFinishedListener(new RequestQueue.RequestFinishedListener<String>() {
@Override
public void onRequestFinished(Request<String> request) {
if (progressDialog != null && progressDialog.isShowing())
progressDialog.dismiss();
}
});
答案 2 :(得分:5)
这是一个非常简单的修复。在你发出截击请求之前,请调用方法progress.show(),然后在你的响应中调用progress.dismiss()只是做了这个并且效果很好!
答案 3 :(得分:-1)
这很容易做到..请参阅下面的代码片段
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);
}