您的位置:首页 > 移动开发 > Android开发

Android进阶之路 - 接口回调(三)

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

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

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("回头已是百年时");
}


下载地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 接口回调