Android OkHttp(1)

来源:互联网 发布:utorrent mac版 编辑:程序博客网 时间:2024/05/16 11:48


Android OkHttp(1)


OkHttp是一个流行的第三方开源网络请求框架,在目前的一些APP开发中比较流行。Android平台开源的网络请求框架不少,比如常见的Volley, AsyncHttpClient等等。
一些开发者逐渐的不再使用原先旧的AsyncHttpClient,原因很多,比如AsyncHttpClient底层的实现使用了Android旧的网路请求API,而在新版的SDK中,这些API不再被支持。同时AsyncHttpClient不支持缓存,而像Volley则支持缓存。等等各方面的对比使得OkHttp突显出来更多的优势。
OkHttp在github上的项目主页是:https://github.com/square/okhttp 
我写一个简单的例子说明OkHttp的使用。
这个例子很简单,在一个布局中放一个ImageView,然后使用OkHttp对我csdn的博客头像地址发起请求,请求得到的byte组装成Bitmap,然后设置到ImageView显示出来。
布局文件很简单,就一个ImageView。从略。
Java代码:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package zhangphil.demo;  
  2.   
  3. import android.graphics.Bitmap;  
  4. import android.graphics.BitmapFactory;  
  5. import android.support.v7.app.AppCompatActivity;  
  6. import android.os.Bundle;  
  7. import android.widget.ImageView;  
  8.   
  9. import java.io.IOException;  
  10.   
  11. import okhttp3.Call;  
  12. import okhttp3.OkHttpClient;  
  13. import okhttp3.Request;  
  14. import okhttp3.Response;  
  15. import okhttp3.Callback;  
  16.   
  17.   
  18. public class MainActivity extends AppCompatActivity {  
  19.   
  20.     private final String image_url = "http://avatar.csdn.net/9/7/A/1_zhangphil.jpg";  
  21.   
  22.     @Override  
  23.     protected void onCreate(Bundle savedInstanceState) {  
  24.         super.onCreate(savedInstanceState);  
  25.         setContentView(R.layout.activity_main);  
  26.   
  27.         //在布局里面放一个ImageView,放网络请求后的图片  
  28.         final ImageView image = (ImageView) findViewById(R.id.imageView);  
  29.   
  30.         //初始化OkHttpClient  
  31.         final OkHttpClient client = new OkHttpClient();  
  32.   
  33.         //创建OkHttpClient针对某个url的数据请求  
  34.         Request request = new Request.Builder().url(image_url).build();  
  35.   
  36.         Call call = client.newCall(request);  
  37.   
  38.         //请求加入队列  
  39.         call.enqueue(new Callback() {  
  40.             @Override  
  41.             public void onFailure(Call call, IOException e) {  
  42.                 //此处处理请求失败的业务逻辑  
  43.             }  
  44.   
  45.             @Override  
  46.             public void onResponse(Call call, Response response) throws IOException {  
  47.                 //我写的这个例子是请求一个图片  
  48.                 //response的body是图片的byte字节  
  49.                 byte[] bytes = response.body().bytes();  
  50.                 //response.body().close();  
  51.   
  52.                 //把byte字节组装成图片  
  53.                 final Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);  
  54.   
  55.                 //回调是运行在非ui主线程,  
  56.                 //数据请求成功后,在主线程中更新  
  57.                 runOnUiThread(new Runnable() {  
  58.                     @Override  
  59.                     public void run() {  
  60.                         //网络图片请求成功,更新到主线程的ImageView  
  61.                         image.setImageBitmap(bmp);  
  62.                     }  
  63.                 });  
  64.             }  
  65.         });  
  66.     }  
  67. }  


本例使用OkHttp从一个URL下载图片数据然后装配成Bitmap设置到ImageView里面,其实如果仅仅是从一个URL加载图片,则可以考虑使用Glide(见附录文章2),Glide内部使用了缓存,不像本例的OkHttp那样,没有使用缓存,Glide使用缓存,如果一个URL下载的图片成功,再次请求就从缓存中读取而不是重复浪费计算资源再次请求图片。


附录文章:
1,《Android第三方异步网路加载库AsyncHttpClient内部实现缓存策略了吗?》链接地址:http://blog.csdn.net/zhangphil/article/details/48595817 
2,《Android图片加载与缓存开源框架:Android Glide》链接:http://blog.csdn.net/zhangphil/article/details/45535693


0 0