在之前的项目中用到了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的库。