Android okHttp总结篇一

在之前的项目中用到了okHttp框架,如今回头看,还是感觉似懂非懂,还得总结总结。
okHttp初体验
  • 1.主要功能:

    • get请求
    • post请求
    • 基于Http的文件上传
    • 文件下载
    • 加载图片
    • 支持请求回调,直接返回对象、对象集合
    • 支持session
  • 2.图片下载

    • 贴代码

      1.module的build.gradle文件添加

       compile 'com.squareup.okhttp3:okhttp:3.4.1'
       compile 'com.squareup.okio:okio:1.9.0'
      

      2.xml布局:

       <?xml version="1.0" encoding="utf-8"?>
       <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       	    xmlns:tools="http://schemas.android.com/tools"
       	    android:layout_width="match_parent"
       	    android:layout_height="match_parent"
       	    android:paddingBottom="@dimen/activity_vertical_margin"
       	    android:paddingLeft="@dimen/activity_horizontal_margin"
       	    android:paddingRight="@dimen/activity_horizontal_margin"
       	    android:paddingTop="@dimen/activity_vertical_margin"
       	    android:orientation="vertical"
       	    tools:context="com.wyk.okhttp.okhttpdemo01.MainActivity">
       	
       	    <Button
       	        android:layout_width="match_parent"
       	        android:layout_height="wrap_content"
       	        android:text="OkHttp初体验"
       	        android:id="@+id/button1" />
       	
       	    <ImageView
       	        android:layout_width="wrap_content"
       	        android:layout_height="wrap_content"
       	        android:id="@+id/imageView"/>
       	
       </LinearLayout>
      

      3.MainActivity代码:

       /**
        * OkHttp框架
        * yk
        */
       public class MainActivity extends AppCompatActivity {
       
           private ImageView imageView;
           private Button button1;
       
           private final static int STATUS_FAILURE = 0;
           private final static int STATUS_SUCCESS = 1;
           private final static String Tag = MainActivity.class.getSimpleName();
           private String img_path = "http://www.apkbus.com/data/attachment/common/cf/191843z46r2hhah5b25d6t.png";
       
           private OkHttpClient client;
           private Request request;
           private Handler handler = new Handler(){
               @Override
               public void handleMessage(Message msg) {
                   switch(msg.what){
                       case STATUS_SUCCESS:
                           byte[] byt =  (byte[])msg.obj;
                           Bitmap bitmap = BitmapFactory.decodeByteArray(byt, 0, byt.length);
                           /**Bitmap bitmap = new CropTransform().transform
       											(BitmapFactory.decodeByteArray(byt, 0, byt.length));*/
                           imageView.setImageBitmap(bitmap);
                           break;
                       case STATUS_FAILURE:
                           Toast.makeText(MainActivity.this,"加载失败[0,2]",Toast.LENGTH_SHORT).show();
                           break;
                       default:
                           break;
                   }
               }
           };
       
           /**
            * Could not find method java.nio.file.Files.newOutputStream, referenced 	from method okio.Okio.sink
            * 记得添加okio
            *
            */
           @Override
           protected void onCreate(Bundle savedInstanceState) {
               super.onCreate(savedInstanceState);
               requestWindowFeature(Window.FEATURE_RIGHT_ICON);
               setContentView(R.layout.activity_main);
       
               imageView = findView(R.id.imageView);
               button1 = findView(R.id.button1);
       
               request = new Request.Builder().get().url(img_path).build();
               client = new OkHttpClient();
               button1.setOnClickListener(new View.OnClickListener() {
                   @Override
                   public void onClick(View v) {
                           client.newCall(request).enqueue(new Callback() {
                               @Override
                               public void onFailure(Call call, IOException e) {
                                 //  e.printStackTrace();
                                   Toast.makeText(MainActivity.this,"加载失败[0,1]",Toast.LENGTH_SHORT).show();
                               }
                               @Override
                               public void onResponse(Call call, Response response) throws IOException {
                                   Message message = handler.obtainMessage();
                                   if(response != null && response.isSuccessful()){
                                       message.what = STATUS_SUCCESS;
                                       message.obj = response.body().bytes();
                                       handler.sendMessage(message);
                                   }else{
                                       handler.sendEmptyMessage(STATUS_FAILURE);
                                   }
                               }
                           });
                   }
               });
           }
       
           private <T> T findView(int viewId){
               T view = (T) findViewById(viewId);
               return view;
           }
       }
      

      4.最后别忘了清单文件添加 " "

    • 运行效果

      这里写图片描述

  • 2.图片裁剪

    • okHttp也提供了图片裁剪的功能

    • 贴代码

      1.build.gradle文件添加

         compile 'com.squareup.picasso:picasso:2.5.2'
      

      2.实现Transformation类,重写transform方法

        /**
         * Created 2016/8/21.
         */
        public class CropTransform implements Transformation {
        
            @Override
            public Bitmap transform(Bitmap source) {
                int height = source.getHeight();
                int width = source.getWidth();
        
                int min = Math.min(height, width);
                int y = (height - min) / 2;
                int x = (width - min) / 2;
        
               /*
               Bitmap bitmap = Bitmap.createBitmap(source, x, y, width,height);导致的异常
               下面是源码
               if (x + width > source.getWidth()) {
                    throw new IllegalArgumentException("x + width must be <= bitmap.width()");    抛出的异常
                }
                */
      
                Bitmap bitmap = Bitmap.createBitmap(source,x,y, width, height);
                if(bitmap != source){
                    source.recycle();
                }
                return bitmap;
           	 }
        
            @Override
            public String key() {
                return "picasso";
            }
        }
      

      3.MainActivity.java改为

        private Handler handler = new Handler(){
                @Override
                public void handleMessage(Message msg) {
                    switch(msg.what){
                        case STATUS_SUCCESS:
                            byte[] byt =  (byte[])msg.obj;
                          //Bitmap bitmap = BitmapFactory.decodeByteArray(byt, 0, byt.length);
                            Bitmap bitmap = new CropTransform().transform
        											(BitmapFactory.decodeByteArray(byt, 0, byt.length));
                            imageView.setImageBitmap(bitmap);
                            break;
                        case STATUS_FAILURE:
                            Toast.makeText(MainActivity.this,"加载失败[0,2]",Toast.LENGTH_SHORT).show();
                            break;
                        default:
                            break;
                    }
                }
            };
      

      4.运行效果

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kWRQT6ag-1593331718139)(https://img-blog.csdn.net/20160821012114016)]
      
总结:
  • 1.相比Android系统的HttpURLConnection类,okHttp功能方面有着绝对的优势,而且HttpURLConnection需要手动封装
  • 2.OkHttp使用Okio来大大简化数据的访问与存储,Okio是一个增强 java.io 和 java.nio的库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值