回调:A实现接口Callback,重写了方法callback(),在这里callback方法是具体的实现方法,我的理解是回调向外暴漏接口,但是需要数据,要通过B类的数据实现不一样的重写。B中含有某个方法,这个方法的有一个参数是实现了A的实例(A实现了接口),B的这个方法也可以获得外部重写方法所需要的数据,所以在B 的这个方法中才是真正调用已经重写好的外部方法。
实例:
接口ResultListener相当于接口Callback,里面的getResult方法相当于callback()方法。
package com.siyusoulmate.huidiaotest;
public interface ResultListener {
void getResult(int result);
}
MainActivity相当于A,MainActivity实现了接口ResultListener (CallBack)
package com.siyusoulmate.huidiaotest;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
//用回调实现model将result传递给presenter处理(为什么要传递?传递出去可以实现多个不同的处理)
public class MainActivity extends AppCompatActivity implements ResultListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//将实现了ResultListener的自身传递给Model作为参数
Model model=new Model(this);
// Log.e("m", "onCreate: "+model.getResult());
model.handle();
}
//重写方法,在B中实际调用的是这个方法
@Override
public void getResult(int result) {
// 实际处理
Log.e("TAG", "getResult: "+result );
}
}
Model相当于B,Model中含有构造函数,构造函数中有ResultListener作为参数,实际传递的是A的实例,以为A已经实现了ResultListener,所以可以将A的实例传递给ResultListener。
package com.siyusoulmate.huidiaotest;
public class Model {
private int result;
private ResultListener resultListener;
public Model( ResultListener listener){
//这里获得了重写了具体方法的listener
resultListener=listener;
}
private void getResult(){
// 模拟网络读取到结果result,将result交由外部处理
result= (int) (Math.random()*100);
// return result;
}
public void handle(){
getResult();
if(resultListener!=null){
//因为这里的resultListener是A,那便是调用A中重写的getResult
resultListener.getResult(result);
}
}
/* public void setResult(int result) {
this.result = result;
}*/
}
MVP实例:
回调接口:
package com.siyusoulmate.myapplication7;
public interface ResultListener {
void getResult(int result);
}
model层:
package com.siyusoulmate.myapplication7;
import android.util.Log;
public class ModelClass {
//假设通过网络请求获得的结果为33;
private int result=33;
public void login(String userName,String password,ResultListener listener){
Log.e("TAG", "login: "+password+userName );
listener.getResult(result);
}
}
presenter层:
package com.siyusoulmate.myapplication7;
public class PresenterClass {
private ModelClass modelClass;
private loginView loginView;
public PresenterClass(loginView loginView){
this.loginView=loginView;
modelClass=new ModelClass();
}
public void login(String userName,String password){
modelClass.login(userName, password, new ResultListener() {
@Override
public void getResult(int result) {
if(loginView!=null){
loginView.loginResult(result);
}
}
});
}
}
view层:
package com.siyusoulmate.myapplication7;
public interface loginView {
void loginResult(int result);
}
package com.siyusoulmate.myapplication7;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements loginView{
private PresenterClass presenterClass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
presenterClass=new PresenterClass(this);
presenterClass.login("111","222");
}
@Override
public void loginResult(int result) {
Toast.makeText(this,"chenggong",Toast.LENGTH_LONG).show();
}
}