Android okHttp总结篇一

来源:互联网 发布:怎么卸载mac自带系统 编辑:程序博客网 时间:2024/05/01 15:26

在之前的项目中用到了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.运行效果

      这里写图片描述

总结:

  • 1.相比Android系统的HttpURLConnection类,okHttp功能方面有着绝对的优势,而且HttpURLConnection需要手动封装
  • 2.OkHttp使用Okio来大大简化数据的访问与存储,Okio是一个增强 java.io 和 java.nio的库。
0 0
原创粉丝点击