接口回调(重点是理解)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chenrushui/article/details/52053600

模板性代码:

    private MyListener myListener;
    
    public interface MyListener {
        //通过抽象方法的参数传递数据的
        void getData(Response res);
    }

    //回调方法
    public void setOnListener(MyListener myListener) {
        this.myListener = myListener;
    }

通过接口引用为抽象方法赋值

    myListener.getData(Response res);

在另一个类中的某个方法中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);
    }
}


RecycleView中的点击事件的写法
//写一个接口
public interface MyItemClickListener {
    public void onItemClick(View view,int postion);
}

//写一个回调方法
private MyItemClickListener mListener;
public void setOnItemClickListener(MyItemClickListener listener){  
    this.mItemClickListener = listener;  
}  

//你想在什么时候触发此方法进行回调?
@Override  
public void onClick(View v) {  
    if(mListener != null){  
        mListener.onItemClick(v,getPosition());  
    }  
} 


DownloadManager:具体的业务逻辑类,

在某一个Activity中,如果要处理下载逻辑,肯定要持有DownloadManager类的引用,创建这个类的对象,才能调用其中的方法;

 

用接口去规范行为(请求成功和请求失败这两种行为)

 

public interface OnDownloadListener{

//下载监听

}

 

在寻皮革项目中,我把所有的接口都写到业务逻辑类里面了,其实接口是可以单独抽取出来的。接口和业务逻辑类分开写。

 

需要一个接口的实现类:

1)让当前Activity实现接口,变成接口的实现类;

2)写一个类去实现接口,实现其中的抽象方法,然后在需要的地方创建一个接口实现类的子类对象

3)直接在当前位置使用匿名对象实现,创建一个接口实例。

 

回调原理:

接口调用自己的抽象方法,相当于接口的实现类调用实现类中重写的抽象方法;

 

接口中没有构造函数:

1接口中是没有构造函数的,不能直接创建对象,只能由实现类创建对象;接口中的成员常量不需要进行初始化,所以不需要构造函数。

2而抽象类是有构造方法的,为了给子类调用初始化抽象类中的成员变量。

 

接口的特点:

1接口用关键字interface表示;类实现接口用implements表示

2接口不能实例化:那么,接口如何实例化呢?按照多态的方式,由具体的子类实例化。其实这也是多态的一种,接口多态。

3接口的子类:要么是抽象类,要么重写接口中的所有抽象方法。

 

接口中的成员:

成员变量:只能是常量  默认修饰符 public static final(不能被修改)

构造方法:没有,因为接口主要是扩展功能的,而没有具体存在

成员方法:只能是抽象方法  默认修饰符 public abstract(可以省略)

 

类与类,类与接口以及接口与接口的关系:

类与类: 继承关系,只能单继承,但是可以多层继承

类与接口:实现关系,可以多实现,还可以在继承一个类的同时实现多个接口。

接口与接口:继承关系,可以单继承,也可以多继承。


定义一个接口:里面只放url的好处是?2不能被修改,直接类名点方法名调用。

接口用来解耦的,尽量不要在activity写太多的业务逻辑。


阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页