介绍
为啥使用这个框架。这个框架有那些优点
1 Android 轻量级框架
2 Android 系统提供Http 通信类 HttpURLConnection和HttpClient
尽管Google 再大部分安卓版本中推荐使用 HttpURLConnection 但是这个类相对于HttpClient 功能太少了 需要手动封装
HttpClient(这个类冗余代码过多)
3 Okhttp是一个相对成熟的解决方案,android4.4的源码中可以看到HtppUrlConnection已经替换成OkHttp实现了。
使用
<uses-permission android:name="android.permission.INTERNET"/>
implementation("com.squareup.okhttp3:okhttp:3.14.0")
implementation 'com.squareup.picasso:picasso:2.71828'
官方地址:https://github.com/square/okhttp
加载并剪切一个图
package com.liuan.ok_demo;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.nfc.Tag;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import java.io.IOException;
import androidx.appcompat.app.AppCompatActivity;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class OkActivity extends AppCompatActivity implements View.OnClickListener {
/**
* 图片下载
*/
private Button mButton;
private ImageView mImageView;
private final static int SUCESS_STATUS = 1;
private final static int FAIL_STATUS = 2;
private static final String TAG = "OkActivity";
private String imgage_path = "http://lorempixel.com/800/400/sports/";
private Handler handle = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case SUCESS_STATUS:
byte[] result = (byte[]) msg.obj;
// 获取图片的数据
Bitmap tmp_bitmap = BitmapFactory.decodeByteArray(result, 0, result.length);
// 直接裁剪,返回裁剪后的数据
Bitmap bitmap = new CropSquareTrans().transform(tmp_bitmap);
mImageView.setImageBitmap(bitmap);
Log.e(TAG, "handleMessage: SUCESS_STATUS");
break;
case FAIL_STATUS:
Log.e(TAG, "handleMessage: FAIL_STATUS");
break;
}
}
};
private OkHttpClient client;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ok);
initView();
}
private void initView() {
mButton = (Button) findViewById(R.id.button);
mButton.setOnClickListener(this);
mImageView = (ImageView) findViewById(R.id.imageView);
client = new OkHttpClient();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
default:
break;
case R.id.button:
Log.e(TAG, "onClick: start");
// 使用的是get请求
Request request = new Request.Builder().get().url(imgage_path).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e(TAG, "onFailure: " + e.toString());
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Message message = handle.obtainMessage();
Log.e(TAG, "onResponse: " + response.isSuccessful());
if (response.isSuccessful()) {
message.what = SUCESS_STATUS;
message.obj = response.body().bytes();
handle.sendMessage(message);
} else {
message.what = FAIL_STATUS;
}
}
});
Log.e(TAG, "onClick: end");
break;
}
}
}
布局
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".OkActivity">
<Button
android:id="@+id/button"
android:layout_width="379dp"
android:layout_height="44dp"
android:text="图片下载"
tools:layout_editor_absoluteX="16dp"
tools:layout_editor_absoluteY="651dp" />
<ImageView
android:id="@+id/imageView"
android:layout_width="376dp"
android:layout_height="615dp"
app:srcCompat="@mipmap/ic_launcher"
tools:layout_editor_absoluteX="18dp"
tools:layout_editor_absoluteY="18dp"
tools:srcCompat="@tools:sample/backgrounds/scenic[3]" />
</androidx.constraintlayout.widget.ConstraintLayout>
CropSquareTrans
package com.liuan.ok_demo;
import android.graphics.Bitmap;
import android.os.Build;
import com.squareup.picasso.Transformation;
import androidx.annotation.RequiresApi;
public class CropSquareTrans implements Transformation {
@Override
public Bitmap transform(Bitmap source) {
int size=Math.min(source.getWidth(),source.getHeight());
int x=(source.getWidth()-size)/2;
int y=(source.getHeight()-size)/2;
Bitmap bitmap = Bitmap.createBitmap(source, x, y,size,size);
if(bitmap!=source){
source.recycle();
}
return bitmap;
}
@Override
public String key() {
return "square()";
}
}