首先先分包
分包明确后先写入要求中的网络请求方法
public interface OkhttpCallback {
void failure(String msg);//服务器请求失败:断网,服务器宕机等等因素
void success(String result);//数据合法
}
private Handler handler = new Handler() ;
private OkHttpClient okHttpClient;
private static OkhttpUtils mInstance;//私有属性
private OkhttpUtils() {//私有构造方法
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
okHttpClient = new OkHttpClient.Builder()
.addInterceptor(loggingInterceptor)//添加日志拦截器
.writeTimeout(5, TimeUnit.SECONDS)
.connectTimeout(5, TimeUnit.SECONDS)
.readTimeout(5, TimeUnit.SECONDS)
.build();//链式调用,构建者模式
}
/**
* 创建实例,双重检验锁,单例模式进行实例化
*
* @return
*/
public static OkhttpUtils getInstance() {
if (mInstance == null) {
synchronized (OkhttpUtils.class) {
if (mInstance == null) {
mInstance = new OkhttpUtils();
}
}
}
return mInstance;
}
/**
* get请求方式
*/
public void doGet(String url, final OkhttpCallback requestCallback) {
Request request = new Request.Builder().url(url)
.get().build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
if (requestCallback != null) {
handler.post(new Runnable() {
@Override
public void run() {
requestCallback.failure("网络异常");
}
});
}
}
@Override
public void onResponse(Call call, final Response response) throws IOException {
final String result = response.body().string();
if (requestCallback != null) {
handler.post(new Runnable() {
@Override
public void run() {
requestCallback.success(result);
}
});
}
}
});
}
/**
* Post请求方式
*/
public void doPost(String url, HashMap<String, String> parmas, final OkhttpCallback callback) {
FormBody.Builder builder = new FormBody.Builder();
for (Map.Entry<String, String> map : parmas.entrySet()) {
builder.add(map.getKey(), map.getValue());
}
RequestBody requestBody = builder.build();
Request request = new Request.Builder().url(url)
.post(requestBody).build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
if (callback != null) {
handler.post(new Runnable() {
@Override
public void run() {
callback.failure("网络异常");
}
});
}
}
@Override
public void onResponse(Call call, final Response response) throws IOException {
if (callback != null) {
if (200 == response.code()) {
final String result = response.body().string();
handler.post(new Runnable() {
@Override
public void run() {
callback.success(result);
}
});
}
}
}
});
}
/**
* 上传头像,文件
*/
public void uploadFile(String url, HashMap<String, Object> params, final OkhttpCallback okhttpCallback) {
MultipartBody.Builder builder = new MultipartBody.Builder();
builder.setType(MultipartBody.FORM);
for (Map.Entry<String, Object> map : params.entrySet()) {
String key = map.getKey();
Object value = map.getValue();
if (value instanceof File) {
File file = (File) value;
builder.addFormDataPart(key, file.getName(), RequestBody.create(MediaType.parse("image/*"), file));
} else {
builder.addFormDataPart(key, value.toString());
}
}
Request request = new Request.Builder().url(url).post(builder.build()).build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
if (okhttpCallback != null) {
handler.post(new Runnable() {
@Override
public void run() {
okhttpCallback.failure("网络异常");
}
});
}
}
@Override
public void onResponse(Call call, final Response response) throws IOException {
if (okhttpCallback != null) {
final String result = response.body().string();
handler.post(new Runnable() {
@Override
public void run() {
okhttpCallback.success(result);
}
});
}
}
});
}
/**
* 取消所有请求,好处:节省开销:内存开销,cpu的开销(线程开销)
*/
public void cancelAllTask() {
if (okHttpClient != null) {
okHttpClient.dispatcher().cancelAll();
}
}
public interface RequestCallback {
void failure(String msg);//服务器请求失败:断网,服务器宕机等等因素
void successMsg(String msg);//请求成功,但数据不正确
void success(User user);//数据合法
void success(String result);//数据合法
}
model层
public class ProductModel implements ProductContract.IProductModel {
Handler handler=new Handler();
@Override
public void getProductModel( HashMap<String, String> params, final RequestCallback requestCallback) {
OkhttpUtils.getInstance().doPost(ProductApi.PRODUCT_URL, params, new OkhttpCallback() {
@Override
public void failure(String msg) {
requestCallback.failure("网络不可用");
}
@Override
public void success(String result) {
paserResult(result,requestCallback);
}
});
}
private void paserResult(String result, RequestCallback requestCallback) {
User user = new Gson().fromJson(result, User.class);
requestCallback.success(user);
}
}
presenter
public class ProductPresenter extends ProductContract.ProductPresenter {
ProductModel productModel;
ProductContract.IProductView iProductView;
public ProductPresenter(ProductContract.IProductView iProductView) {
productModel=new ProductModel();
this.iProductView = iProductView;
}
@Override
public void getProductList(HashMap<String, String> params) {
String keyword = params.get("keyword");
String page = params.get("page");
productModel.getProductModel(params, new RequestCallback() {
@Override
public void failure(String msg) {
iProductView.failure(msg);
}
@Override
public void successMsg(String msg) {
}
@Override
public void success(User user) {
iProductView.success(user);
}
@Override
public void success(String result) {
}
});
}
}
MainActivity
public class MainActivity extends AppCompatActivity implements ProductContract.IProductView {
private RecyclerView recyclerView;
List<User.DataBean> list;
private ProductPresenter presenter=new ProductPresenter(this);
private ProductAdapter adapter;
HashMap<String,String> params= new HashMap<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.recyclerView);
LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this,1,false);
recyclerView.setLayoutManager(linearLayoutManager);
params.put("keywords","手机");
params.put("page",1+"");
list=new ArrayList<>();
presenter.getProductList(params);
}
@Override
public void success(User success) {
list=success.getData();
adapter= new ProductAdapter(this,list);
recyclerView.setAdapter(adapter);
}
@Override
public void failure(String msg) {
}
}
adapter适配器
public class ProductAdapter extends RecyclerView.Adapter<ProductAdapter.ViewHolder> {
private Context context;
private List<User.DataBean> list;
public ProductAdapter(Context context, List<User.DataBean> list) {
this.context = context;
this.list = list;
}
@NonNull
@Override
public ProductAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view=LayoutInflater.from(context).inflate(R.layout.item_list,viewGroup,false);
ViewHolder viewHolder=new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull ProductAdapter.ViewHolder viewHolder, int i) {
User.DataBean dataBean = list.get(i);
viewHolder.text.setText(dataBean.getTitle());
String images = dataBean.getImages();
String[] imgAttr = images.split("\\|");
Glide.with(context).load(imgAttr[0]).into(viewHolder.image);
}
@Override
public int getItemCount() {
return list.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
private final ImageView image;
private final TextView text;
public ViewHolder(@NonNull View itemView) {
super(itemView);
image = itemView.findViewById(R.id.image);
text = itemView.findViewById(R.id.text);
}
}
}