Android进阶之路

来源:互联网 发布:股票走势图软件 编辑:程序博客网 时间:2024/06/10 23:58

对…,你没有看错!接口回调这已经是我写的第三篇博文了,之前的概念一直迷迷糊糊,一直照猫画虎,只有其形,而无其意,这篇本章可能是目前为止理解最深的一篇关于接口回调的博文了,我以俩种方式进行讲解的,第一种是常规方式,进行举例,第二种方式是已观察者和订阅者的理解举例的。

后面的补充内容,为后期补录的彩蛋!

Effect :

这里写图片描述

代码中的 A/B/C标注均有作用,后续可自行查看执行逻辑。

个人理解:
1.接口回调主要有三方,一方为需求方(A方),这里我们往往要获取我们想要的数据,如我们需要投资理财产品,这时候我们就需要找对应平台产品去投资,就像房屋中介一样的性质,这里我们用的就是接口(一个容器,简称B方),由B去帮我们找数据,找资源,让他去处理,而B去查看的区域,就是C方了, 这里告诉了我们该具体都是哪一款产品,哪一款房子!(其实在这里我们已经把我们想要的数据存储在了B方),之后我们就可以返回A方,进行数据填充,确定投资方向!

这里的执行逻辑是 :A - B - C - A
这里的写入(就是写代码的顺序)逻辑是:B - C - A or B - A -C

2.现在的三方框架如EvEntBus或者RxAndroid or RxJava,EventBus下我们在数据改变处(监听)可以发送状态,进行数据存入,然后在数据可需处,进行EventBus的注册,注册, 然后通过sub方法进行数据读取进行操作。
这个更像Rx下的机制,我们都知道现在很多这样的开发模式中,有观察者,被观察者,执行者,其实这里也可以很好的诠释接口回调的问题,我们在数据获取的类,放入被观察者(接口),然后回到数据可需处,等被观察者的数据的存入,我们在当前调用执行者进行逻辑处理

OwnListener (接口 - 容器):

package com.yl.aninterface.interfacedata;/** * Created by YongLiu on 2017/7/21. */public interface OwnListener {     void setData (String string);}

Listener (监听处 - 相当于Set数据的过程) :

package com.yl.aninterface.interfacedata;import android.content.Context;/** * Created by YongLiu on 2017/7/21. */public class Listener {    public Context mContext;    public OwnListener ownListener;    public Listener(Context context,OwnListener listener){        this.mContext=context;        this.ownListener=listener;    }    //B :数据处理     void setListener(){        ownListener.setData("这里我们储存了数据");    }}

MainActivity (这里我们相当于发送请求(执行过程:1.发送 2.查看接口实现处 3.接口实现处获取的数据 4.设置接口中已经保存的数据)):

package com.yl.aninterface.interfacedata;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.TextView;public class MainActivity extends AppCompatActivity implements View.OnClickListener,OwnListener {    private TextView mView;    private TextView mContent;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mView = (TextView) findViewById(R.id.tv_btn);        mContent = (TextView) findViewById(R.id.tv_content);        mView.setOnClickListener(this);    }    @Override    public void onClick(View v) {        // A :相当于发送数据        if(v.getId()==R.id.tv_btn){             new Listener(this, this).setListener();        }    }    // C :获取数据    @Override    public void setData(String string) {        mContent.setText(string);    }}

补充内容:因为准备在新项目中采用MVP的开发模式进行开发,所以接口回调的使用必须熟练使用,故意进行博文补录

目前梳理之后,我归结为接口的回调的常用使用方式有三种,下面通过代码片段帮助大家理解

第一种,常规监听

思想总结 : A类调用B类方法,当B类的方法回调接口,把结果传回A类

下面代码中,MainActivity 代表 A类, AClass代表B类

执行步骤:
1.创建一个接口,同时接口内部创建一个方法,用于数据回传(MainActivity 处实现此接口),如

package com.bakheet.effect.interfacedemo;/** * Created by YongLiu on 2017/11/8. */public interface MainListener {    void setData(String data);}

2.在ManiActivity中实现这个接口,如

    @Override    public void setData(String data) {        mBtn.setText(data);    }

3.调用AClass的方法,首先要拥有AClass的实例,之后调取AClass中的

  aClass = new AClass(this);         mBtn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                aClass.setData("MainActivity 传到 AClass的数据");            }        });

4.AClass类的代码要注意,首先要拥有MainListener的成员变量,注册在成员方法中,如

    public MainListener listener;    public AClass(MainListener listener){        this.listener=listener;    }    public void setData(String data) {        String ste=data+"AClass 接收信息之后的回传";        listener.setData(ste);    }

第二种方法,常用的成功,失败回调

1.创建接口

package com.bakheet.effect.interfacedemo;/** * Created by YongLiu on 2017/11/8. */public interface BListener {    void Succeed();    void Faieail();}

2.AClass类创建方法,满足一定条件之后,使用接口进行标记

  void setListener(String ste,BListener bListener){        if(ste.equals("MainActivity 传到 AClass的数据AClass 接收信息之后的回传")){            Log.e("tag","AClass要传入的数据");            bListener.Succeed();        }else{            Log.e("tag","Main传来的数据");            bListener.Faieail();        }    }

3.MainActivity 调用处

   aClass = new AClass(this);   aClass.setListener(mBtn.getText().toString(), new BListener() {            @Override            public void Succeed() {                Log.e("tag", "Set Succeed回调");            }            @Override            public void Faieail() {                Log.e("tag", "Set Faieail回调");            }        });

第三种方式 ,Activity 之间接口回调

主要思想 :中转站思想,使用Manager进行接口中转,如

package com.bakheet.effect.interfacedemo;/** * Created by YongLiu on 2017/11/8. */public class InterManager {    public SecoundListener secoundListener;    private InterManager() {    }    public static InterManager interManager = new InterManager();    public InterManager getInstance() {        return interManager;    }    public void setSecoundListener(SecoundListener secoundListener) {        this.secoundListener = secoundListener;    }}

SecoundListener :

package com.bakheet.effect.interfacedemo;public interface SecoundListener{        void getData(String data);    }

MainActivity :

    //注册监听  同时实现接口内方法 InterManager.interManager.setSecoundListener(this);    @Override    public void getData(String data) {        Toast.makeText(this, "---" + data, Toast.LENGTH_SHORT).show();        mBtn.setText(data);    }

SecoundActivity :

     mBtn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                sendData(InterManager.interManager.secoundListener);            }        });   private void sendData(SecoundListener listener) {        listener.getData("回头已是百年时");    }

下载地址

原创粉丝点击