Volley和AsyncTask

pmb*_*pmb 45 android android-networking android-volley

我读了一篇关于Volley的帖子,我知道这是一个很棒的网络库.但我无法理解一件事.

所有请求都是异步任务?

当我想使用Volley发送asyncTask请求时,我是否需要在AsyncTask中输入Volley请求?或者如果它已经是AsyncTask请求,我应该调用Volley Request吗?

 private class MyClass extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... params) {
           // do Volley request
        }
}
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?

Gru*_*Gru 60

您不需要在AsyncTask上运行Volley请求.

为什么:

他们在单独的线程上管理所有网络相关任务.如果仔细观察库项目,他们就不会想象AsyncTask.但他们能够有效地智能地处理所有与网络相关的任务.

检查Volley主包中的RequestQueue.java

我在这里粘贴java doc.

/**
 * A request dispatch queue with a thread pool of dispatchers.
 *
 * Calling {@link #add(Request)} will enqueue the given Request for dispatch,
 * resolving from either cache or network on a worker thread, and then delivering
 * a parsed response on the main thread.
 */
Run Code Online (Sandbox Code Playgroud)

编辑:

形成请求:

使用Volley,网络通信由RequestQueue管理.使用RequestQueue及其所有工具(尤其是缓存)的最佳方法是将其实例化一次并将其作为单例保留.此时,您可以添加或取消请求,停止或启动请求,以及访问响应缓存.

RequestQueue queue =Volley.newRequestQueue(this);
Run Code Online (Sandbox Code Playgroud)

一旦RequestQueue被实例化,就必须形成一个请求.这可以通过Volley Library中包含的几个不同的"开箱即用"请求类或将Volley的请求类扩展到您自己的自定义请求中来完成.已包含在Volley中的请求类是String请求,JSON请求和图像请求.Volley库中包含的大多数请求类都使用类似下面的构造函数.

传递给构造函数的参数:

RequestMethod(get,post,delete等) JSONObject - 将随您的请求一起发布的可选对象 ResponseListener - 请求完成后您的数据将在哪里 ErrorListener - 当您的请求出现问题时会告诉您什么.

JsonObjectRequest request = JsonObjectRequest(Requestmethod, url, null,  new ResponseListener(), new ErrorListener());
Run Code Online (Sandbox Code Playgroud)

收到回复的列表:

成功的响应侦听器

private class ResponseListener implements Response.Listener{
  @Override
  public void onResponse(JSONObject response){

  }
}
Run Code Online (Sandbox Code Playgroud)

错误响应侦听器

private class ErrorListener implements Response.ErrorListener{
  @Override
  public void onErrorResponse(VolleyError error){

  }
}
Run Code Online (Sandbox Code Playgroud)

最后将您的请求添加到Request队列,Volley将为您处理的所有内容.

打电话:

现在,我们已经创建了请求和响应类,我们已准备好将请求添加到队列并检索数据.为此,我们只需将请求添加到队列中.

queue.add(request);
Run Code Online (Sandbox Code Playgroud)

然后,响应或错误将传递给我们在请求中定义的响应/错误类.您可以一次向队列添加任意数量的请求,并将响应传递到各自的响应/错误类

  • 经过很长时间的休息(几年)后,我正在重新访问Android,并安装了Android Studio(Google的官方Android IDE)。我使用电子邮件/密码登录模板设置了一个新项目,登录活动中的样板代码包括一个“ AsyncTask”,您应该在其中放置HTTP请求。这让我感到困惑,这就是导致我提出这个问题的原因。我假设Google在这种情况下不打算让您使用Volley吗? (2认同)

小智 6

当你使用Volley时,没有必要将它与它结合使用AsyncTask.它在你的另一个线程上做网络的东西.

是使用Volley进行网络呼叫的基本示例.如您所见,所有代码都在其中Activity,无需任何定义AsyncTask.

  • 很遗憾,您的答案中的链接已被破坏. (7认同)
  • @FilipedeLimaBrito这就是为什么最好在答案中包含相关代码而不是将来可能破坏的链接. (2认同)