问题描述
由于我的项目需要多次和后台拿数据,之前已经使用了自己封装的Okhttp工具,但是还是要重复的写Callback的两个方法和生成Message对象
解决方法
重写Callback接口,把重复的onFailure方法复用,重复的消息对象操作复用
运用思想:减少重复代码、抽象
优化后
private void getGateList() {
String url = Constant.GET_GATELIST + Constant.account;
OkhttpUtil.doGetJsonObject(url, new MyCallback(GET_LIST_OK) {
@Override
public void sendMsg(Message msg) {
super.sendMsg(msg);
mHandler.sendMessage(msg);
}
});
}
怎么样是不是简单了很多,要自己打的代码也变少了.然后自己需要获取数据成功返回什么数据(GET_LIST_OK=1)也可以在new的时候传入,对我自己来说真的是非常好用了
下面来看看重写的这个Callback,使用时有特殊需求可以随时重写
public class MyCallback implements Callback {
private Message msg = new Message();
private int what;
public MyCallback() {
}
public MyCallback(int what) {
this.what = what;
}
@Override
public void onFailure(Call call, IOException e) {
msg.what = -1;
msg.obj = "服务器异常";
sendMsg(msg);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String json = response.body().string();
msg.what = what;
msg.obj = json;
sendMsg(msg);
}
/**
* 用来获取Msg发消息给Handler的
*
* @param msg
*/
public void sendMsg(Message msg) {
this.msg = msg;
}
}
问题描述
经常要用Dialog,但是种类又不同
有些有view、有些没有
有些比较复杂,有些直接连后台
解决方法
决定采用工厂模式
一个Dialog工厂生产各种我需要的Dialog
1.实现方法接口
你想要你的所有Dialog都会的操作
public interface ShowDialog {
public void show();
}
2.接口的实现类
关键是show方法可以把对话框弹出来并且按钮逻辑要实现好
顺便还用到了泛型保证删除后可以remove各种类型的List
public class DeleteDialog implements ShowDialog {
private Activity context;
private String url;
private List<?> list;
private int pos;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 200: {
context.runOnUiThread(new Runnable() {
@Override
public void run() {
ToastUtil.toast("删除成功!! ", context);
list.remove(pos);
gatewayAdapter.notifyDataChanged();
}
});
break;
}
}
}
};
public DeleteDialog(Activity context, String url, List<?> list, int pos) {
this.context = context;
this.url = url;
this.list = list;
this.pos = pos;
}
@Override
public void show() {
/*
* 简单实现可编辑对话框(方法内多行注释)
*/
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("确定要删除吗?:").setIcon(android.R.drawable.ic_dialog_info)
.setNegativeButton("Cancel", null);
builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
OkhttpUtil.doGetJsonObject(url, new MyCallback(200) {
@Override
public void sendMsg(Message msg) {
super.sendMsg(msg);
handler.sendMessage(msg);
}
});
}
});
builder.show();
}
}
3.实现静态工厂类
使用这种工厂模式的好处就是不需要创建实例,直接调用即可。
public class DialogFactory {
public static ShowDialog produceDeleteDialog(Activity context, String url, List<?> list, int pos) {
return new DeleteDialog(context, url, list, pos);
}
public static ShowDialog produceAddGatewayDialog(Activity activity, List<DeviceManagerItem> deviceManagerItems) {
return new AddGatewayDialog(activity,deviceManagerItems);
}
}
4.实际使用
//参数按位置介绍
//用于在其他类更新UI、后台的删除接口、需要删除的List、需要删除的位置
ShowDialog showDialog = DialogFactory.produceDeleteDialog(mContext, url, gatewayList, pos);
showDialog.show();
//生产第二种Dialog
ShowDialog showDialog=DialogFactory.produceAddGatewayDialog(getActivity(),deviceManagerItems);
showDialog.show();