gpt4 book ai didi

android - 使用 EventBus 或 Otto 时减少事件类的数量

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:54:12 25 4
gpt4 key购买 nike

我即将开始开发一款 Android 应用。我有兴趣在我的应用程序中使用 Otto 或 EventBus 来协助进行异步 REST 网络调用并在调用返回时通知主线程。我在研究过程中发现使用这些总线的一个主要缺陷是有通常必须创建太多的事件类。是否有任何模式或方法可以减少必须使用的事件类的数量?

最佳答案

概念

我解决太多事件类问题的最好方法是使用静态嵌套类 您可以阅读更多关于它们的信息 here .

现在使用上面的概念来解决问题:

所以基本上假设您有一个名为 Doctor 的类,您正在使用它来创建一个您在应用程序中传递的对象。但是,您希望通过网络发送相同的对象并在同一对象的上下文中检索 JSON,并将其反馈给订阅者以进行处理。您可能会创建2 个类

  1. DoctorJsonObject.java 包含有关返回的 JSON 数据的信息和
  2. DoctorObject.java,其中包含您在应用中传递的数据。

你不需要那样做。改为这样做:

public class Doctor{
static class JSONData{
String name;
String ward;
String id;
//Add your getters and setter
}

static class AppData{
public AppData(String username, String password){
//do something within your constructor
}
String username;
String password;
//Add your getters and setters
}
}

现在您有一个 Doctors 类,它封装发送到网络的事件和从网络返回的事件。

  1. Doctor.JSONData表示从网络返回的Json格式的数据。

  2. Doctor.AppData 表示在应用中传递的“模型”数据。

然后将类的 AppData 对象用于发布事件:

/*
You would post data from a fragment to fetch data from your server.
The data being posted within your app lets say is packaged as a doctor
object with a doctors username and password.
*/

public function postRequest(){
bus.post(new Doctor.AppData("doctors_username","doctros_password"));
}

您实现中的订阅者监听此对象并发出 http 请求并返回 Doctor.JSONData:

/*
retrofit implementation containing
the listener for that doctor's post
*/
@Subscribe
public void doctorsLogin(Doctor.AppData doc){
//put the Doctor.JSONObject in the callback
api.getDoctor(doc.getDoctorsName(), doc.getPassWord(), new Callback<Doctor.JSONObject>() {
@Override
public void success(Doctor.JSONObject doc, Response response) {
bus.post(doc);
}

@Override
public void failure(RetrofitError e) {
//handle error
}
});
}
}

通过上述实现,您已将所有 Doctor 对象相关事件封装在 ONE Doctor 类中,并使用静态内部类在不同时间访问您需要的不同类型的对象。更少的类更多的结构。

关于android - 使用 EventBus 或 Otto 时减少事件类的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31528509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com