Android服务及其引擎
我对使用服务有一个疑问。我有一个初始化对象的服务,将该服务的实例传递给该对象以便它可以用于该对象是一种不好的做法吗?简化对象为:Android服务及其引擎,android,android-service,android-service-binding,Android,Android Service,Android Service Binding,我对使用服务有一个疑问。我有一个初始化对象的服务,将该服务的实例传递给该对象以便它可以用于该对象是一种不好的做法吗?简化对象为: public class MyService extends Service { MyObject myObject = new MyObject(this); ... } public MyObject { private MyService myService; public MyObject(MyService mySer
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()
}
}
我想得越多,解决方案就越好。你觉得怎么样
提前非常感谢 这毫无意义。如果需要将回调传递给dao(websocket控制器),我建议您使用接口。问题是,您应该使用您的服务来实现websocket控制器。 请添加websocket代码,以便我们建议进行更多更改 编辑:
你可以考虑在你的对象中存储你的服务的弱引用。对象生活在某个生命周期中。我想是活动吧。在没有活动引用的情况下,对象无法启动或停止您的服务。你为什么这么做?我看到你们在服务中执行方法是为了什么?谢谢你们的回答。该对象不是活动,而是连接到websocket的引擎,因此当我从该get套接字(在MyObject中)收到响应时,我必须将更改通知服务。但是,由于这不是一个活动/片段,我无法绑定到该服务。这应该添加为comment.not answer。感谢您的回答。我编辑了更多信息。事实上,当第二个类解析和处理来自web套接字的响应时,例如,如果出现错误,那么第二个类必须通知服务类,以便更改当前状态并重新连接。非常感谢您的回答。我不明白传递服务实例和传递接口实例之间有什么区别。不过,多亏了你的回答,我想到了另一个解决方案,我认为这可能会更好。我已经用这个解决方案编辑了我的答案,你认为呢?谢天谢地,Againyou的解决方案具有与使用接口相同的效果,但接口是为此目的而创建的,以这种方式重写方法是一种糟糕的做法,因为要做的是创建接口。服务是复杂的类,它有自己的生命周期、线程,并且由android内部管理,它们不应该这样使用,也许会发生糟糕的事情,也许不会,但从面向对象的角度来看,这是错误的。接口就是为了这个目的而设计的,它们只是类之间的桥梁,这就是为什么你应该使用它们,而不是试图为已经回答的问题创建自己的解决方案。谢谢你的回答,我会考虑的。有一个问题,创建接口和在没有接口的情况下传递服务对象之间有什么区别?为什么只做:publicmoobject(MyService-MyService){this.MyService=MyService}而不是onGetData?做MyObject MyObject=新的MyObject(这个);在初始化而不是onCreate方法上?
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)
}
}