2017-01-26 1 views
6

Human Activity Recognition을 수행하는 Android 앱을 개발 중입니다.Android 서비스가 MVP 패턴에서 수행해야하는 역할은 무엇입니까?

기본적으로 작동합니다. 서비스는 지속적으로 액셀러레이터 데이터를 읽고 인식 된 활동 (예 : 걷기, 달리기)을 데이터베이스에 저장합니다. 사용자는 활동중인 ListView에있는 인식 된 모든 활동을 볼 수 있습니다 (데이터베이스 액세스). 데이터베이스의 모든 사용자 테이블에는 서비스가 데이터베이스에서 읽고 일부 검사를 수행하는 pa_goal (물리적 활동 목표) 필드가 있습니다.

사용자는 물론 활동에서이 목표를 변경할 수 있습니다. 이후 MVP 아키텍처 패턴을 구현할 예정입니다.

서비스를 어디에 둘 것인지 확실하지 않습니다. 반드시보기가 아닙니다. 어떤 충고?

+0

데이터 모델의 일부분이 아닙니까? – pskink

+0

@pskink 서비스는 데이터를 데이터베이스에만 저장합니다. 이것은 무엇입니까. 복용량을 모델로 간주해야한다는 의미입니까? MVP의 목적이 Java 코드에서 안드로이드 코드를 분리하는 것이기 때문에 혼란 스럽습니다. 그렇다면 모델로 내 서비스를 위협한다면 잘못하지 않았을까요? –

+1

일종의 사용자 정의 ContentProvider를 사용하고 있습니까? 그렇다면 https://github.com/googlesamples/android-architecture/tree/todo-mvp-contentproviders/ (일반적으로 https://github.com/googlesamples/android-architecture) – pskink

답변

8

MVP를 사용한다고 가정하고있는 깨끗한 아키텍처에서는 비즈니스 로직과 프레임 워크를 분리한다는 아이디어가 있습니다. 이것은 본질적으로 정상적인 발표자가 할 수있는 것입니다.

이 경우에는 다루지 않는보기이지만 원칙은 비슷합니다. 보다 나은, 더 많은 단일 책임 클래스를 분리 할 수있는 경우 모든 비즈니스 또는 응용 프로그램 논리가 Android 코드에 섞이는 것을 원하지는 않습니다. 따라서 뷰가 아닌 동안 발표자 유형 클래스 (컨트롤러 또는 관리자라고하는 것이 더 나을 수도 있음)가 있어야한다고 말하고 싶습니다.

이 클래스는 표준 junit 테스트 및 서비스 모의로 쉽게 테스트 할 수있는 서비스 작동 방식을 제어하는 ​​POJO입니다. 그러면이 클래스와 서비스를 자체 기능 패키지에 넣고 발표자와 동일한 방식으로 백엔드 모델과 상호 작용할 수 있습니다.

요약하면, 역할은 다른 기능 (일반적으로 내 경험의보기 인)과 함께 사이트의 앱 기능 중 하나입니다.

도움이 되길 바랍니다.

+0

고마워, Alex! 정말 도움이됩니다! :) –

+0

나는 단 하나의 질문이 있습니다. 이 클래스는 컨트롤러가 컨텍스트 (예 : 서비스를 시작하기 위해)에 전달되어야하므로 안드로이드 특정 코드가 포함될 것이라고 생각하는 것이 맞습니까? –

+1

이상적으로 컨텍스트를 전달하면 안됩니다. 컨텍스트가 안드로이드 코드이므로 컨트롤러를 테스트하기가 더 쉬워 지도록 서비스에 유지하려고합니다. 컨텍스트가 하나님 객체가되도록하지 마십시오;) – MungoRae

1

나는 같은 상황에 있습니다. 마지막으로 나는 이런 식으로 뭔가를하기로 결정 :

활동 조각이 범위를 벗어나, 그들은 MVP에 대해 아무것도 몰라하지만 난 그래서, 신호/이벤트를 보낼 오토 같은 이벤트 버스를 사용하기 위하여려고하고있다 :

어떤 종류의 Presenter를 확장하는 내 클래스는 Android Context에 대해 모르고 있지만 onAttachPresenter 및 onDetachPresenter 만있는 MvpView 인터페이스를 갖습니다.

Service를 확장하는 클래스는 Presenter 특성을 가지며 onSucess, onError, onStart, onComplete 또는 Otto에 대한 동일한 이벤트 (onSucessEvent, onErrorEvent, onStartEvent, onCompleteEvent)와 함께 일부 MvpView 인터페이스를 구현합니다.

그래서 뭔가를해야 할 때 활동이나 단편이 서비스를 시작하고 서비스가 "시작"하거나 발표자와 이야기 할 것이며 발표자가 성공하면 mvpView.onSuccess()를 호출하여 정보를 저장합니다 SQLite (storeIO 어쩌면)를 가진 로컬 DB 내부에서 그리고 마지막으로 Service는 Otto를 호출하고 아마도 onComplete (아마 아무런 데이터없이) 신호를 전달할 것입니다. 마지막으로 신호가 내 UI (조각 일 가능성이 있음)에 의해 catch되고 SQLite에서 DB 내의 모든 정보를 검색합니다.

그래서 onSucess가 발생하면 UI에 가장 최신의 최상의 데이터가 표시되지만 onError가 발생하면 사용자에게 "적어도 문제가 있지만 (원하는 경우) 정보를 표시합니다. 뭔가를 볼 수 있습니다. ", bot onSuccess 및 onError는 결국 onComplete를 호출합니다.

이것이 최선의 해결책인지는 모르겠지만이 경우에는 사용자가 기기를 회전 할 때 활동 또는 단편 수명주기를 다루지 않고 onSaveInstance를 신경 쓰지 않고 데이터를 복원 할 것입니다. 그것은 DB 내부에서 항상 최신 데이터를 가져오고, 어떤 일이 발생하면 (인터넷에 연결되어 있지 않은 경우) onComplete 신호를받을 때 적어도 뭔가를 보여줄 수 있습니다.

일부 사실 난 아직도 생각하고 :

  • 발표자는 싱글 톤 클래스되지 않습니다를
  • 발표자하여 MyApplication 클래스의 경우 한 화면에 대해 어떻게됩니까
  • (단편과 네 컨텍스트에 대해 아무것도 알고 있지만,) 당신은 다른 onSuccessEvents와 차별화 된 서비스를 가지고 있습니까? ID로 일종의 행동을 사용하여 식별하십시오.
  • Activity Fragment가 MvpView를 구현하지 못하게하면 라이프 사이클을 처리해야합니다. 당신이 정확히 일치하지 않을 수도 있지만
+0

의 서비스에 발표자를 투입 할 생각이었습니다. 그는 그에게 좋은 해결책이다. Context를 매개 변수로 요구하는 Controller라는 또 다른 클래스를 작성하기로 결정했습니다 (roboelectric로 해당 클래스를 테스트해야 함). 그리고 Presenter에는이 클래스의 인스턴스가 있으므로 어떤 안드로이드 전용 코드도 알지 못하므로 시작할 수 있습니다. 서비스와 중지 :). 발표자의 라이브 사이클은 내 경우에 그렇게 나쁘지 않습니다. –

+1

조각이나 활동이 서비스를 시작하면 나쁘지는 않습니다. 안드로이드는 안드로이드 콘텐츠를 알고 있지만 MVP는 안다. –

3

이 문서에서는, 아이디어는 동일, 유사한 상황에서 저를 도와 :

https://android.jlelse.eu/android-bound-services-and-mvp-12ca9f70c7c7

기본적으로, 저자는 바운드 서비스가 있다는 사실 주위에 작동 액티비티와 밀접하게 결합되어 있으며 추가 라이프 사이클 호출을 추가합니다.

+0

당신의 제안에 감사드립니다, 호세. 확실히 기사를 살펴볼 것입니다! :) –

관련 문제