OKHttp
框架特性
仅支持GET和POST两种方式,其他如PUT等不太常用,就暂不支持
基于POST的大文本数据、二进制文件上传,即通过Http Body提交
表单提交,带有文件的表单提交和表单提交支持参数名重复,在后台接收到的是数组或集合
支持session保持
对HTTPS支持单向认证和双向认证
支持同步请求和异步请求,统一的数据处理接口
开箱即用,默认的配置基本上满足需求
需要添加的依赖
//OKhttp依赖
implementation("com.squareup.okhttp3:okhttp:4.2.0")
//解析依赖
implementation 'com.google.code.gson:gson:2.8.5'
//glidee
implementation("com.github.bumptech.glide:glide:4.10.0") {
exclude group: "com.android.support"
}
//recycelrview,列表控件,和listview差不多,升级版
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'com.jakewharton:butterknife:10.2.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.1'
implementation 'com.github.tongchexinfeitao:QRCodeLibrary:1.0'
//okhttp日志拦截器
implementation 'com.squareup.okhttp3:logging-interceptor:4.2.2'
//EventBus依赖
implementation 'org.greenrobot:eventbus:3.1.1'
自定义拼接接口
public class Api {
//自定义拼接接口
public static String BASE_URL="http://172.17.8.100/";
public static String BANNER_URL=BASE_URL+"small/commodity/v1/findCommodityByKeyword?keyword=手机&page=1&count=10";
}
Mvp
M层
//数据模型层,不需要写任何代码
public interface IBaseModel {
}
V层
//view层基类
public interface IBaseView {
}
p层
public abstract class BasePresenter<M extends IBaseModel,V extends IBaseView> {
public M model;
public WeakReference<V> weakReference;
public BasePresenter(){
model=initModel();//对model进行初始化
}
//绑定方法
public void attch(V v){
weakReference=new WeakReference<>(v);
}
protected abstract M initModel();
//解绑:节省内存(防止内存泄露)
public void deach(){
if (weakReference!=null){
weakReference.clear();
weakReference=null;
}
}
//获取MVP的View对象
public V getView(){
return weakReference.get();
}
}
base封装Activity
BaseActivity
public abstract class BaseActivity<P extends BasePresenter> extends AppCompatActivity implements IBaseView {
public P presenter;
Unbinder unbinder;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//找布局
setContentView(layoutId());
unbinder= ButterKnife.bind(this);
presenter=initPresneter();
if (presenter!=null){
presenter.attch(this);//绑定当前View
}
initView();
initData();
}
protected abstract P initPresneter();
protected abstract void initData();
protected abstract void initView();
protected abstract int layoutId();
//释放资源
@Override
protected void onDestroy() {
super.onDestroy();
if (unbinder!=null){
unbinder.unbind();
}
if (presenter!=null){
presenter.deach();
}
}
}
utils
OkHttpUtils
public class OkHttpUtils {
Handler handler=new Handler();
private static OkHttpUtils okHttpUtils;
private OkHttpClient okHttpClient;
public static OkHttpUtils getInstance() {
if (okHttpUtils==null){
synchronized (OkHttpUtils.class){
if (okHttpUtils==null){
okHttpUtils=new OkHttpUtils();
}
}
}
return okHttpUtils;
}
private OkHttpUtils(){
okHttpClient=new OkHttpClient.Builder()
//拦截器
.addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
.build();
}
//doget请求方法
public void doGet(String url,OkHttpCallBack okHttpCallBack){
Request request=new Request.Builder()
.url(url)
.get()
.build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
if (okHttpCallBack!=null){
okHttpCallBack.failure(e);
}
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
//子线程处理网络数据
String result=response.body().string();
if (okHttpCallBack!=null){
handler.post(new Runnable() {
@Override
public void run() {
okHttpCallBack.success(result);
}
});
}
}
});
}
//dopost请求方法
public void doPost(String url, HashMap<String,String> params,OkHttpCallBack okHttpCallBack){
FormBody.Builder builder=new FormBody.Builder();
if (params!=null&¶ms.size()>0){
for (Map.Entry<String, String> stringStringEntry : params.entrySet()) {
builder.add(stringStringEntry.getKey(),stringStringEntry.getValue());
}
}
Request request=new Request.Builder()
.url(url)
.post(builder.build())
.build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
if (okHttpCallBack!=null){
okHttpCallBack.failure(e);
}
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
//子线程处理网络数据
String result=response.body().string();
if (okHttpCallBack!=null){
handler.post(new Runnable() {
@Override
public void run() {
okHttpCallBack.success(result);
}
});
}
}
});
}
public interface OkHttpCallBack{
void success(String result);
void failure(Throwable throwable);
}
}
契约类
IHomeContract
public interface IHomeContract {
interface IModel extends IBaseModel {
void getData(String url,IModelCallBack iModelCallBack);
interface IModelCallBack{
void success(HomeEntity homeEntity);
void failure(Throwable throwable);
}
}
interface IView extends IBaseView{
void success(HomeEntity homeEntity);
void failure(Throwable throwable);
}
interface IPresenter{
void getData(String url);
}
}
HomeModel抽基类
解析
public class HomeModel implements IHomeContract.IModel {
@Override
public void getData(String url, IModelCallBack iModelCallBack) {
//解析
OkHttpUtils.getInstance().doGet(url, new OkHttpUtils.OkHttpCallBack() {
@Override
public void success(String result) {
final HomeEntity homeEntity = new Gson().fromJson(result, HomeEntity.class);
if (iModelCallBack != null) {
iModelCallBack.success(homeEntity);
}
}
@Override
public void failure(Throwable throwable) {
if (iModelCallBack != null) {
iModelCallBack.failure(throwable);
}
}
});
}
}
P层抽基类
public class HomePresenter extends BasePresenter<HomeModel, IHomeContract.IView> implements IHomeContract.IPresenter {
@Override
public void getData(String url) {
model.getData(url, new IHomeContract.IModel.IModelCallBack() {
@Override
public void success(HomeEntity homeEntity) {
getView().success(homeEntity);
}
@Override
public void failure(Throwable throwable) {
getView().failure(throwable);
}
});
}
@Override
protected HomeModel initModel() {
return new HomeModel();
}
}
显示页面
MainActivity
public class MainActivity extends BaseActivity<HomePresenter> implements IHomeContract.IView {
@BindView(R.id.rv)
RecyclerView rv;
@Override
protected HomePresenter initPresneter() {
return new HomePresenter();
}
@Override
protected void initData() {
//设置接口地址
presenter.getData(Api.BASE_URL + "small/commodity/v1/findCommodityByKeyword?keyword=手机&page=1&count=10");
}
@Override
protected void initView() {
//设置recycelrview布局管理器(必须)
rv.setLayoutManager(new GridLayoutManager(this,2));
}
@Override
protected int layoutId() {
return R.layout.activity_main;
}
@Override
public void success(HomeEntity homeEntity) {
//给recycelrview设置适配器
final HomeAdapter homeAdapter = new HomeAdapter(this, homeEntity.getResult());
rv.setAdapter(homeAdapter);
}
@Override
public void failure(Throwable throwable) {
}
}
RecyclerView适配器
public class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewhorlder> {
private Context context;
private List<HomeEntity.ResultBean> list;
public HomeAdapter(Context context, List<HomeEntity.ResultBean> list) {
this.context = context;
this.list = list;
}
@NonNull
@Override
public MyViewhorlder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//找布局
final View inflate = View.inflate(context, R.layout.item_rev, null);
final MyViewhorlder myViewhorlder = new MyViewhorlder(inflate);
return myViewhorlder;
}
@Override
public void onBindViewHolder(@NonNull MyViewhorlder holder, int position) {
//设置数据
//设置文本数据
holder.name.setText(list.get(position).getCommodityName());
//设置图片资源
Glide.with(context)
.load(list.get(position).getMasterPic())
.placeholder(R.mipmap.ic_launcher)
.error(R.mipmap.ic_launcher)
.circleCrop()
.into(holder.im);
//点击跳转二维码界面
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
context.startActivity(new Intent(context, CodeActivity.class));
}
});
}
@Override
public int getItemCount() {
return list.size();
}
//自定义ViewHorlder
class MyViewhorlder extends RecyclerView.ViewHolder {
@BindView(R.id.im)
ImageView im;
@BindView(R.id.name)
TextView name;
public MyViewhorlder(@NonNull View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
}
}
二维码页面
public class CodeActivity extends BaseActivity {
@BindView(R.id.et)
EditText et;
@BindView(R.id.b1)
Button b1;
@BindView(R.id.iv)
ImageView iv;
@BindView(R.id.tv_send)
Button tvSend;
@BindView(R.id.obj_send)
Button objSend;
@Override
protected BasePresenter initPresneter() {
return null;
}
@Override
protected void initData() {
iv.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
//通过imageView识别二维码图片的信息
CodeUtils.analyzeByImageView(iv, new CodeUtils.AnalyzeCallback() {
@Override
public void onAnalyzeSuccess(Bitmap mBitmap, String result) {
Toast.makeText(CodeActivity.this, ""+result, Toast.LENGTH_SHORT).show();
}
@Override
public void onAnalyzeFailed() {
Toast.makeText(CodeActivity.this, "解析失败", Toast.LENGTH_SHORT).show();
}
});
return true;
}
});
}
@Override
protected void initView() {
ButterKnife.bind(this);
CodeUtils.init(this);
//注册eventbus
EventBus.getDefault().register(this);
}
@Override
protected int layoutId() {
return R.layout.activity_code;
}
@OnClick(R.id.b1)
public void onViewClicked() {
//设置生成图片
//二维码log
final Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
final Bitmap image = CodeUtils.createImage(et.getText().toString(), 400, 400, bitmap);
iv.setImageBitmap(image);
}
@OnClick({R.id.tv_send, R.id.obj_send})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.tv_send:
//发送字符串
EventBus.getDefault().post("kson");
break;
case R.id.obj_send:
//发送对象
EventBus.getDefault().post(et);
break;
}
}
//接受字符串
@Subscribe(threadMode = ThreadMode.MAIN)
public void getString(String s){
Toast.makeText(this, ""+s, Toast.LENGTH_SHORT).show();
}
//接收对象
@Subscribe(threadMode = ThreadMode.MAIN)
public void getEdittext(EditText editText){
Toast.makeText(this, ""+editText.getText().toString(), Toast.LENGTH_SHORT).show();
}
}