Android 服务及其引擎

Android Service and its engine

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

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

你怎么看?这是一种不好的做法吗?在不传递服务实例的情况下如何解决该问题? 事实上,我想将代码分成两个 classes 因为功能不同,websocket 是从服务 class 连接的,但是通过 websocket 到 parse/send 事件的方法在第二个 class。我想这样做是为了避免一个 class 包含 2000 行代码,并按功能拆分代码。该服务处理 websocket 连接,而另一个 class 处理其他功能。由于一切都是异步的,第二个 class 需要一个服务实例 class。例如:如果收到并解析错误(在第二个 class 上),则第二个 class 必须调用服务 class 来更新其状态并重新连接。

编辑: 我正在考虑实施以下解决方案:

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 代码,以便我们提出更多更改建议。

编辑:

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