接口的定义
一: 接口是抽象类的一种,只包含常量和方法的定义,而没有变量跟具体方法的实现,而且其方法都是抽象方法。他的作用体现在一下几个方面:
- (1)通过接口实现不相关类的相同行为,而无须考虑这些类之间的关系
- (2)通过接口指明多个类需要实现的方法
- (3)通过接口了解对象的交互界面,而无须了解对象所对应的类
二:接口的声明
[public] interface 接口名 [extends父接口名] {
void 方法名();//接口体
}
//extends 子句与类声明的extends 子句基本相同,不同的是一个接口可有多个父类接口,用哪个逗号隔开,而一个类只能有一个父类
//在类的声明中用implements 子句来表示一个类使用某个接口,在类中可以实现接口中定义的常乐,而且必须实现接口中定义的所有方法
三:接口的理解
核心思想:在于它可以具有很多类都需要实现的功能,使用相同接口的类之间不一定有继承关系,在具体实现中实现各自的功能
四:接口回调
interface People {
void peopleList();
}
class Student implements People {
publicvoid peopleList() {
System.out.println("I’m a student.");
}
}
class Teacher implements People {
publicvoid peopleList() {
System.out.println("I’m a teacher.");
}
}
public class Example {
public static void main(String args[]) {
People a; // 声明接口变量
a = new Student(); // 实例化,接口变量中存放对象的引用
a.peopleList(); // 接口回调
a = new Teacher(); // 实例化,接口变量中存放对象的引用
a.peopleList(); // 接口回调
}
}
接口回调是指:
可以把使用实现了某一接口的类创建的对象的引用赋给该接口声明的接口变量,
那么该接口变量就可以调用被类实现的接口的方法
。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这一过程称 为对象功能的接口回调。
五:模板代码
//1 定义接口
private MyListener myListener;
public interface MyListener {
//通过抽象方法的参数传递数据的
void getData(Response res);
}
//回调方法
public void setOnListener(MyListener myListener) {
this.myListener = myListener;
}
//2通过接口引用为抽象方法赋值
myListener.getData(Response res);
//3 在另一个类中的某个方法中getNetData()进行回调网络请求结果
CarGoodsFragment carGoodsFragment = CarGoodsFragment.getInstance("陈如水", 22);
carGoodsFragment.setOnListener(this);
流程是:
1)定义接口: 定义一个接口、定义其中的抽象方法、抽象方法含有参数(被传递的数据);
2)编写回调方法: 在定义接口的类中,编写用户回调的方法,要传递一个接口对象实例,让别的类去实现。(相当于为接口成员变量赋值)
3)为抽象方法赋值: 获取一个全局的接口成员变量,在某个事件中使用接口成员变量调用接口中的方法,并且为抽象方法中的参数赋值。(这一步可以在回调方法中实现)
在另一个页面,在合适的时机,创建此类的实例,调用类中的回调方法,为接口对象赋值this,即可实现回调。
登录模块:点击事件中的方法
private void Login() {
//获取用户输入的参数
String pwd = et_pwd.getText().toString();
String login_name_put = et_login_name.getText().toString();
if (login_name_put == null || "".equals(login_name_put)) {
ToastUtils.showShort("请输入登录帐号");
} else if (pwd == null || "".equals(pwd)) {
ToastUtils.showShort("请输入登录密码");
} else {
HashMap<String, String> paramsMap = new HashMap<>();
//获取请求参数
paramsMap.put("login_name", login_name_put);
paramsMap.put("pwd", pwd);
HashMap<String, String> dataMap = ParamsUtils.getParamsMap(paramsMap);
//调取服务器端接口(网络请求业务类)
LoginManager loginManager = new LoginManager();
loginManager.login(LoginUI.this, LoginUI.this, dataMap);
}
}
实现接口,实现接口中的抽象方法:
@Override
public void loginSuccess(LoginEntity loginStatus) {
ToastUtils.showShort("登录成功");
//1,是否是第一次登录app
SPUtils.put(LoginUI.this, "LOGIN_STATE_FIRST", "2");
//2,存储获取到的SID
SPUtils.put(LoginUI.this, "SID", loginStatus.getSid());
//3,存储用户ID
SPUtils.put(LoginUI.this, "USER_ID", loginStatus.getId());
//4,保存用户的登录状态
SPUtils.put(LoginUI.this, "LOGIN_STATE", true);
//登录成功,直接进行页面跳转
startActivity(new Intent(LoginUI.this, MainUI.class));
finish();
}
@Override
public void loginFail(String msg) {
loadFail(msg);
}
LoginManager里面的业务逻辑
public class LoginManager {
public static void login(final LoginDataListener loginDataListener, Activity activity, Map<String, String> dataMap) {
NetUtils.addRequest(new GsonRequest<LoginEntity>
(
Request.Method.POST,//请求方式
Constant.LOGIN,//请求地址
LoginEntity.class,//返回实体类的封装
dataMap,//请求参数
new Response.Listener<LoginEntity>() {
@Override
public void onResponse(LoginEntity response) {
//在这里要判断响应码
if (response.isSuccess()) {
loginDataListener.loginSuccess(response);
} else {
loginDataListener.loginFail(TextUtils.isEmpty(response.getMessage()) ? "获取数据失败" : response.getMessage());
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
LogUtils.i("test", error.getMessage());
}
}
), activity);
}
public interface LoginDataListener {
//激活成功后的数据
void loginSuccess(LoginEntity loginStatus);
void loginFail(String msg);
}
}