Android中的接口的使用举例

12 篇文章 0 订阅

这里讲解了两种大家可以在学习Android中容易对接口迷茫的两种用法

1.用于回调

我们会在子线程中执行耗时操作,就可以用接口进行耗时操作结果的回调;

首先定义一个接口

public interface OnNetInfoCallback {
    //获取信息成功
    void onSuccess(String info);
    //获取信息失败
    void onFailure();
}

在该类中我们进行模拟耗时操作,用接口进行结果的回调 

第一种写法:

可以看到在该类中定义了接口的实例,然后给其赋值,最后在getInfo方法中,用这个接口进行了结果的回调

public class InfoService {
    private OnNetInfoCallback onNetInfoCallback;

    public void setOnNetInfoCallback(OnNetInfoCallback onInfoFetchCallback) {
        this.onNetInfoCallback = onInfoFetchCallback;
    }

    public void getInfo() {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                    onNetInfoCallback.onSuccess("" + new Date());
                } catch (Exception e) {
                    onNetInfoCallback.onFailure();
                }
            }
        });
        thread.start();
    }
}

 我们在MAinActivity中,对回调的结果进行处理,并且调用getInfo让其返回结果,

button.setOnClickListener(view -> {
            InfoService infoService = new InfoService();
           
            infoService.setOnNetInfoCallback(new OnNetInfoCallback() {
                @Override
                public void onSuccess(String info) {
                    Log.e("TAG", "onSuccess: " + info );
                }

                @Override
                public void onFailure() {

                }
            });
         infoService.getInfo();
            
        });

第二种写法(更简洁)

直接可以把接口就放在方法参数中

可以看到在该类中的getInfo方法中,接收了一个接口函数

public class InfoService {
    public void getInfo(OnNetInfoCallback onInfoFetchCallback) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                    onInfoFetchCallback.onSuccess("" + new Date());
                } catch (Exception e) {
                    onInfoFetchCallback.onFailure();
                }
            }
        });
        thread.start();
    }
}

然后我们就可以在Activity中调用了该类的方法,并传入一个接口对象,然后实现在接收到回调结果之后做什么UI操作

button.setOnClickListener(view -> {
            InfoService infoService = new InfoService();
            infoService.getInfo(new OnNetInfoCallback() {
                @Override
                public void onSuccess(String info) {
                    Log.e("TAG", "onSuccess: "+info );
                }

                @Override
                public void onFailure() {

                }
            });
        });

2.在MVP中使用

比如我现在有一个MainActivity,想要使用MVP模式,举一个最简单的例子

首先定义一个interface叫做xxxContract,可以理解为接口的集合接口

这个接口里面又包括了关于控制View变化的接口MainView  和  控制逻辑的接口MainPresenter,即常说的P层

public interface MainContract {
    interface MainView{
        void refreshText(String str);
    }

    interface MainPresenter{
        void updateText(String str);
    }
}

 然后我们去实现具体的Presenter,在这个里面可以用于实现具体的逻辑,以及控制什么时候去调用更新UI的接口

也就是说我们的MainView中的什么时候去实现是由MainPresenter去决定的

public class MainPresenter implements MainContract.MainPresenter{
    MainContract.MainView mainView;

    public MainPresenter(MainContract.MainView mainView){
        this.mainView = mainView;
    }

    @Override
    public void updateText(String str) {
        mainView.refreshText(str);
    }
}

 然后我们将MainActivity实现控制UI的接口,将this传入presenter的参数中,意味着当前MainActivity是MainView的实现类,在Persenter里面进行的操作会在MainActivity也进行

然后在其实现的接口中进行具体的UI操作即可

public class MainActivity extends AppCompatActivity implements MainContract.MainView{

    private Button button;
    MainPresenter presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        presenter = new MainPresenter(this);
        button = findViewById(R.id.button);
        button.setOnClickListener(view ->{
            presenter.updateText("new string");
        });
    }


    @Override
    public void refreshText(String str) {
        button.setText(str);
    }
}

可能会有人说:那MVP这么麻烦,就是一个修改button字符串就写了这么多代码有什么好处?

其实MVP的好处就是将逻辑和view层分开,我们在activity写逻辑的话可能代码很乱,这里一块那里一块,代码多且乱,想改必须得全篇搞懂原有代码

而使用了MVP之后,不仅可以有接口直接表明这个方法是干嘛的,而且逻辑和UI的逻辑分离,代码不乱,想改哪一部分可以直接改。

Android,Activity之间的数据传递可以通过以下几种方式: 1. 使用Intent传递数据 ``` // 在Activity1传递数据到Activity2 Intent intent = new Intent(Activity1.this, Activity2.class); intent.putExtra("key", value); startActivity(intent); // 在Activity2获取数据 String value = getIntent().getStringExtra("key"); ``` 2. 使用Bundle传递数据 ``` // 在Activity1传递数据到Activity2 Intent intent = new Intent(Activity1.this, Activity2.class); Bundle bundle = new Bundle(); bundle.putString("key", value); intent.putExtras(bundle); startActivity(intent); // 在Activity2获取数据 Bundle bundle = getIntent().getExtras(); String value = bundle.getString("key"); ``` 3. 使用静态变量传递数据 ``` // 在Activity1设置静态变量 public static String value; // 在Activity1启动Activity2 Intent intent = new Intent(Activity1.this, Activity2.class); startActivity(intent); // 在Activity2获取数据 String value = Activity1.value; ``` 4. 使用接口回调传递数据 ``` // 在Activity1定义接口 public interface OnDataChangeListener { void onDataChanged(String value); } // 在Activity1启动Activity2并设置接口 Intent intent = new Intent(Activity1.this, Activity2.class); Activity2.setOnDataChangeListener(new OnDataChangeListener() { @Override public void onDataChanged(String value) { // 处理数据 } }); startActivity(intent); // 在Activity2通过接口回调传递数据 OnDataChangeListener listener = Activity2.getOnDataChangeListener(); if (listener != null) { listener.onDataChanged(value); } ``` 以上几种方式都可以实现Activity之间的数据传递,具体使用哪种方式取决于实际需求和场景。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值