Android服务及其引擎

时间:2016-02-25 16:38:07

标签: android android-service android-service-binding

我对使用服务有一点怀疑。我有一个初始化对象的服务,将服务实例传递给对象是不是一种不好的做法,因此它可以用于该对象?简化的对象是:

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()
    }
}

我想的越多,我认为它就是更好的解决方案。你觉得怎么样?

非常感谢你!

1 个答案:

答案 0 :(得分: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)
  }
}