MVP 모드와 UI 업데이트의 우연한 만남

3년 넘게 javaEE를 하면서 안드로이드 개발을 열심히 하고 있습니다. 다른 사람의 프로젝트 코드를 읽을 때 보기와 논리 코드를 습관적으로 Activity 클래스에 쓰거나 한 업무 클래스에 정적 방법을 많이 쓴 다음에 뷰, context,handler를 한 무더기 전송하는 것을 발견했습니다.그리고view층의 물건을 업무류에 다시 넣는다. 습관적인 MVC인 JavaEeer로서는 참을 수가 없다. 책을 읽는 과정(*android 개발에서 반드시 알아야 할 50가지 비결)에 안드로이드 개발에서 자주 사용하는 MVP 모델을 소개한 장이 있는데 여자 자리로서 한번 해 볼 필요가 있다고 생각한다.
다음 코드는 Github(https://github.com/fgnna/aidaban)
패키지 경로:
- 뷰 레이어, activity/Fragment 등
-presenter 주도기, 보기층과 데이터층 간의 업무 호출 + 모델 인터랙션 모델 층 인터페이스를 담당하고 모델이 실현해야 할 방법을 정의한다. 예를 들어 하나의 데이터 + 뷰 인터페이스 층 인터페이스를 가져오거나 보기의 textview 층 인터페이스를 업데이트하는 등이다.
- 모델 레이어, 데이터 레이어라고
다음에 나는 모두 세 개의 실체류와 두 개의 인터페이스류가 있다
먼저 주도기:
ChoicePresenter: 주도기에서 한 가지 일만 하고 실례화한 후에 모델에서 첫 페이지의 데이터를 가져와view에 알리고 데이터를 전달합니다
	public ChoicePresenter(Context context, ChoiceViewInterface choiceViewInterface)
	{
		this.mContext = context;
		this.mChoiceViewInterface = choiceViewInterface;
		this.mChoiceModelInterface = new ChoiceModel();
		this.init();
	}
	
	//     
	private void init()
	{
		new AsyncTask(){
			@Override
			protected Object doInBackground(Object... params)
			{
				//         
				mChoiceViewInterface.initPageData( mChoiceModelInterface.getInitPageData(mContext) );
				return null;
			}
		}.execute(10);
	}

ChoiceViewInterface:view 할 일 정의
       /**
	 *          
	 * @param list       
	 */
	public void initPageData(List<ChoiceBean> list);

ChoiceModelInterface: 모델이 해야 할 일을 정의합니다
        /**
	 *        
	 * 
	 * @param context
	 * @return
	 */
	public List<ChoiceBean> getInitPageData(Context context);

Choice Model implements Choice Model Interface: 모델 구현 클래스, 역할은 더 이상 말하지 않겠습니다.
@Override
	public List<ChoiceBean> getInitPageData(Context context)
	{
		List<ChoiceBean> data = new ArrayList<ChoiceBean>();
                //..............................
		return data;
	}

ViewpagerChoiceFragment implements ChoiceViewInterface:view층,ChoiceViewInterface 인터페이스를 실현하고 인터페이스 방법을 완성해야 합니다
@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
	{
		//             ,       ,(         ,          )
		mListView= (ListView) inflater.inflate(R.layout.viewpager_choice, container, false);
		
		this.mChoicePresenter = new ChoicePresenter(getActivity().getApplicationContext(),this);
		
		return mListView;
	}
	
	@Override
	public void initPageData(final List<ChoiceBean> list)
	{
		mChoiceListViewAdapter = new ChoiceListViewAdapter(getActivity().getApplicationContext(),list,mChoicePresenter);
		
		handler.post(new Runnable() {
		    public void run() {
		    	mListView.setAdapter(mChoiceListViewAdapter );
		    }
		  });
	}
지금 강조할 수 있는 건
ViewpagerChoiceFragment 이view 층의 클래스는onCreate에서 먼저 실례화합니다
주도기, 그리고 구조 방법을 통해
주도기에서 이후의 모든 업무 논리는
주도기가 완성되어 보기와 업무 논리의 분리를 실현하였다.
그리고 주도자는 이view를 초기화할 때 첫 번째 페이지의 데이터를 가져오고 뷰 업데이트를 알리며 뷰에 데이터를 전달해야 한다는 것을 알고 있다. 이때view는 initPageData(final Listlist)를 완성하는 방법만 알고 있다. 목적은 확실한 것이다. 받은 데이터를view 컨트롤에 업데이트하는 것이다.
이 과정에서 주도기는 전체view와 모델의 중간 부분의 내용을 책임지고 모델이 무엇을 해야 하는지를 정의하고view가 언제 업데이트가 필요한지 알려준다. view와 모델은 모두 독립적으로 자신의 일을 하고 있다. view는 데이터를 어떻게 얻는지 알 필요가 없다. 모델은 데이터만 얻고 결과를 되돌려준다. 그러면 차원 분리, 단일한 직책이 현실화되고그리고 테스트와 유지보수 코드는 더욱 쉽고 특히 여러 사람이 합작하여 개발하는 상황에 적합하다.
마지막으로 동작 감청 사건과 같은 인터페이스도view층이 아닌 주도기에서 이루어져야 한다는 점을 덧붙였다.

좋은 웹페이지 즐겨찾기