MVP 패턴.
MODEL : 데이터 처리.
VIEW : 뷰
PRESENT : MODEL과 VIEW 사이의 매개체
MVP 패턴의 동작
VIEW 에서 사용자 이벤트 수신
VIEW 에서 PRESENTER 이벤트 호출
PRESENTER 에서 MODEL 데이터 요청
MODEL 에서 PRESENTER 로 데이터 전달
PRESENTER 에서 전달받은 데이털 처리 후 VIEW 업데이트 요청
VIEW 에서 화면 업데이트
구현 방법
interface Contact
inner interface View
inner interface Present
View 에서 처리할 이벤트 선언
Present 에서 처리할 이벤트 선언
View를 상속받는 Activiry 구현
Present를 상속받는 Presenter 구현
Presenter 에서 Model로 데이터 요청.(통신을 통한 서버 데이터 요청)
Model 에서 Presenter 가 요청한 데이터를 전달 후 Presenter에서 데이터 가공 후 View에 업데이트 요청
View 로 가공된 데이터를 가지고 화면 업데이트.
MainActivityContract
MainActivity MainActivityContract.View 상속
MainActivityPresenter MainActivityContract.Present 상속
MainActivityDataAction Present에서 데이터 요청
코틀린으로 코드 구현.
/**
* 액티비티 상속 클래스
*/
abstract class BaseActivity : AppCompatActivity() {
/**레이아웃 뷰 추상화 등록*/
protected abstract val layoutId: Int
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(layoutId)
}
}
/**
* mvp 계약자 정의
*/
interface MainActivityContract {
/**
* 단순 화면 처리
* 액티비이에서 뷰 구현
*/
interface View {
/** 뷰에 프레젠터 등록.*/
val presenter: Present
fun buttonClickChangeUI(count: Int)
}
/**
* 프레젠터 뷰와 모델의 데이터 처리
* 프레젠터 클래스를 생성하여 인터페이스 구현.
*/
interface Present {
/**
* 프레젠터에 뷰 등록
*
*/
var view: View?
/** 전달받을 뷰를 등록함.*/
fun attachView(view: View)
/** 뷰 해제*/
fun detachView()
fun buttonClickCountUp(count: Int)
}
}
/**
* MainActivity
*
*/
class MainActivity : BaseActivity(), MainActivityContract.View {
/**BaseActivity에서 상속받은 변수. */
override val layoutId = R.layout.activity_main
/**뷰에 지정한 프레젠터 등록.*/
override val presenter: MainActivityContract.Present = MainActivityPresenter()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
presenter.attachView(this)
buttonEvent()
}
fun buttonEvent() {
button_Click.setOnClickListener(View.OnClickListener {
Log.w("bear", "buttonclick")
presenter.buttonClickCountUp(count)
}
)
}
var count = 0
override fun buttonClickChangeUI(count: Int) {
this.count = count
textview.text = "${this.count}"
}
}
/**
* 데이터를 처리하는 프레젠터
* 처리된 결과를 등록한 뷰에 전달.
*/
class MainActivityPresenter : MainActivityContract.Present {
/**뷰 초기화*/
override var view: MainActivityContract.View? = null
/**뷰 지정.onCreate 에 등록*/
override fun attachView(view: MainActivityContract.View) {
this.view = view
}
/**뷰 해제*/
override fun detachView() {
this.view = null
}
override fun buttonClickCountUp(count: Int) {
view?.buttonClickChangeUI(count + 1)
}
}
이런식으로 사용이 가능하다.
'Android > source code' 카테고리의 다른 글
안드로이드 추상 클래스 이용한 퍼미션 권한 설정. 2-2 (0) | 2018.10.15 |
---|---|
Android RecyclerView 예제 (0) | 2018.10.15 |
동적 레이아웃 등록(xml) (0) | 2018.10.11 |
액티비티 (0) | 2018.09.18 |
안드로이드 추상 클래스 이용한 퍼미션 권한 설정. 2-1 (0) | 2018.08.20 |