安卓服务及其引擎

3

我有一个关于使用服务的疑问。我有一个初始化对象的服务,将服务实例传递给对象以便用于该对象是否是一种不好的做法?一个简化的对象如下:

public class MyService extends Service {
    MyObject myObject = new MyObject(this);


    ...
}

public MyObject {
    private MyService myService;

    public MyObject(MyService myService) {
        this.myService = myService;
    }

    ...
    private void exampleMethod() {
        myService.method();
    }
}

你认为呢?这是一个不好的做法吗?我该如何解决这个问题而又不必传递服务实例?
事实上,我想将代码分成两个类,因为它们的功能不同。websocket从服务类中连接,但是通过websocket发送/解析事件的方法在第二个类中。我这样做是为了避免一个类有2000行代码,并且按功能来分割代码。服务处理websocket连接,而其他类处理其他功能。由于一切都是异步的,所以第二个类需要服务类的实例。例如:如果收到并解析错误(在第二个类中),则必须调用服务类以更新其状态并重新连接。
编辑: 我正在考虑实现以下解决方案:
public class MyService extends Service {
    MyObject myObject = new MyObject() {
          protected void onSuccess() {
              ...
          }
    };


    ...
}

public abstract class MyObject {


    public MyObject() {
    }

    protected abstract void onSuccess();

    ...
    private void exampleMethod() {
        ...
        onSuccess()
    }
}

我越想,就越认为这是更好的解决方案。你觉得呢?非常感谢你的帮助!

你可以考虑在对象中存储一个服务的WeakReference。 - malrok44
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Konstantin Volkov
谢谢您的回答。该对象不是一个活动,而是连接到WebSocket的引擎,因此当我从MyObject获取套接字响应时,必须通知服务进行更改。但是,由于这不是活动/片段,我无法绑定到服务。 - FVod
1个回答

0
这根本没有任何意义。如果您需要将回调传递给dao(websocket控制器),我建议您使用接口。问题在于,您应该使用服务来实现您的websocket控制器。 请添加websocket代码,以便我们可以提出更多的建议。
编辑:
  public interface onGetData {

    public void onSuccess(Object response) // here you pass the obj type you need in your service

    public void onError(Object error) // same, but if things fail

  }



 public class MyService extends Service implements onGetData  {

    @Override
    public void OnCreate() {
       MyObject myObject = new MyObject(this);
    }

    @Override
    public void onSuccess(Object response) {
    }

    @Override
    public void onError(Object error) {
    }


 }


public MyObject {
  private OnGetData onGetData ;

  public MyObject(OnGetData onGetData) {
    this.onGetData = onGetData;
  }

  private void onRequestSuccess(Object response) {
    onGetData.onSuccess(response)
  }

  private void onRequestError(Object error) {
    onGetData.onError(error)
  }
}

// 这是一个注释,没有要翻译的内容。 - Navoneel Talukdar
谢谢您的回答。我已经编辑并提供了更多信息。事实上,由于第二个类解析和处理来自Web套接字的响应,如果出现错误,该第二个类必须通知服务类以更改当前状态并进行重新连接。 - FVod
非常感谢您的回答。我不明白传递服务实例和传递接口实例之间的区别。但是,由于您的回答,我想到了另一种解决方案,我认为这可能更好。我已经用那个解决方案编辑了我的答案,您觉得怎么样?再次感谢。 - FVod
你的解决方案与使用接口具有相同的效果,但接口是为此目的而设计的。以这种方式覆盖方法是一种不好的做法,正确的方法是创建一个接口。服务是复杂的类,具有自己的生命周期、线程,并由Android内部进行管理,不应该以这种方式使用它们,也许会出现问题,也许不会,但从面向对象的角度来看是错误的。接口只是用于这个目的,它们仅仅是类之间的桥梁,这就是为什么你应该使用它们而不是尝试为已经有答案的东西创建自己的解决方案。 - Renato Probst
谢谢您的回答,我会考虑的。有一个问题,创建接口和不使用接口传递服务对象之间有什么区别?为什么不直接这样做:public MyObject(MyService myService){this.myService = myService} 而不是onGetData?在初始化时使用MyObject myObject = new MyObject(this); 而不是onCreate方法呢? - FVod
当您将服务作为接口传递时,Java 在内部将您的服务转换为 MyObject 中的接口(这与执行 String stringObject = MyModel.toString() 相同;stringObject 甚至不知道 myModel 的存在,它只是接收了一个字符串作为其值,无论该字符串来自何处都无关紧要)。每个 Android 类都有自己的生命周期。也许您需要的某些内容仅在 onCreate 或 onStart 后才可用(这是服务完全加载并应实现服务目标的时间)。还有一个 onDestroy,这是您应停止套接字的地方。 - Renato Probst

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接