Volley 的是使用以及接口
说点别的:对于callback的概念及意义。维基百科是这么解释:将一段代码作为參数传递,而这段代码将会在某个时刻被运行; 个人理解就是:为了代码整洁。为了方便调用并运行一些不在同一个java文件里的变量和函数;为了便于对外留出接口,便于后期加入新功能;
/**
- 先简介一下三个类的作用:
- Volley.java:Volley对外暴露的主类,通过 newRequestQueue(…) 函数新建并启动一个请求队列RequestQueue。
- Request:请求的抽象类。StringRequest、JsonRequest、ImageRequest 都是它的子类,表示某种类型的请求。可扩展性强。
- RequestQueue.java:请求队列,里面包含一个CacheDispatcher(用于处理走缓存请求的调度线程)、
NetworkDispatcher数组(用于处理走网络请求的调度线程),一个ResponseDelivery(返回结果分发接口), 通过 start() 函数启动时会启动CacheDispatcher和NetworkDispatchers。 - 接下来再回头看一下Volley的架构图。
- 第一步:把请求加入缓存队列
- 第二步:「缓存调度线程」CacheDispatcher从缓存队列中取出一个请求,如果缓存命中,就读取缓存响应并解析,然后将结果返回到主线程
- 第三步:缓存未命中,请求被加入网络请求队列,「网络调度线程」NetworkDispatcher轮询取出请求,HTTP请求传输,解析响应,写入缓存,然后将结果返回到主线程
*/
举例: public class MainActivity extends AppCompatActivity { private static final String TAG = “lcj MainActivity”; TextView requestNetTv; TextView showNetContentTv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { requestNetTv = findViewById(R.id.request_net); showNetContentTv = findViewById(R.id.show_net_content); requestNetTv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // requestNet(); VolleyHttpUtils.requestNet( “https://www.baidu.com”, MainActivity.this, new VolleyHttpUtils.OnHttpListener() { // 设置监听 @Override public void onResponse(String response) { Log.i(TAG, “onResponse response:” + response); Log.i(TAG, “onResponse threadName:” + Thread.currentThread().getName()); showNetContentTv.setText(response); } @Override public void onErrorResponse(VolleyError error) { Log.e(TAG, “onErrorResponse error:” + error.getMessage()); } } ); } }); } private void requestNet() { // 第一步,利用Volley new出来一个请求队列 RequestQueue mQueue = Volley.newRequestQueue(MainActivity.this); // 第二步,创建一个请求 // 在这里,我们需要关心的就是请求到底是成功还是失败。就这两点。可以利用接口封装起来。 StringRequest stringRequest = new StringRequest( “https://www.baidu.com”, // 请求url new Response.Listener() { // 返回正确结果的监听 @Override public void onResponse(String response) { Toast.makeText(MainActivity.this, “访问成功”, Toast.LENGTH_SHORT).show(); showNetContentTv.setText(response); } }, new Response.ErrorListener() { // 返回错误结果的监听 @Override public void onErrorResponse(VolleyError error) { Log.i(TAG, “onErrorResponse error:” + error.getMessage()); } }); // 第三步,把请求放进队列 mQueue.add(stringRequest); } }
public class VolleyHttpUtils { private static final String TAG = “lcj VolleyHttpUtils”; // 外界除了传入必要的url和上下文之外,最关键的就是要实现我们的接口,这样外界就能方便地交待工作给我们 // 我们不能把东西写死,需要让调用者有一定的自由,他具体想干嘛让他自己去具体发挥,然后真正工作的还是我们自己 public static void requestNet(String url, Context context, final OnHttpListener onHttpListener) { // 第一步:创建队列 RequestQueue mQueue = Volley.newRequestQueue(context); Log.i(TAG, “requestNet threadName:” + Thread.currentThread().getName()); // 第二步:创建请求对象 StringRequest stringRequest = new StringRequest(url, new Response.Listener() { @Override public void onResponse(String response) { Log.i(TAG, “requestNet 2 threadName:” + Thread.currentThread().getName()); // 外界实现接口交待的关于请求的成功的代码在此处被真正执行 onHttpListener.onResponse(response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // 外界实现接口交待的关于请求的失败的代码在此处被真正执行 onHttpListener.onErrorResponse(error); } }); // 第三步:将请求队列添加到请求队列中 mQueue.add(stringRequest); } interface OnHttpListener { void onResponse(String response); void onErrorResponse(VolleyError error); } }
打印结果:
|