package com.cheng.mvcframestudy.asyncmvc.view; import static com.cheng.mvcframestudy.asyncmvc.controller.ControllerProtocol.*; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.widget.ProgressBar; import android.widget.TextView; import com.cheng.mvcframestudy.R; import com.cheng.mvcframestudy.asyncmvc.controller.Controller; import com.cheng.mvcframestudy.asyncmvc.model.Model; import com.cheng.mvcframestudy.asyncmvc.model.ModelData; import com.cheng.utils.Logger; /** * 基于消息的 MVC * 参考 * http://blog.csdn.net/binyao02123202/article/details/7733835 */ public class AsyncMVCDemoActivity extends Activity implements Handler.Callback { private TextView mDataTV; private ProgressBar mLoadingPB; private Controller mController; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_asyncmvcmemo); Logger.TAG = "AsyncMVCDemoActivity"; initView(); initController(); } private void initView() { mDataTV = (TextView) findViewById(R.id.tv_data); mLoadingPB = (ProgressBar) findViewById(R.id.pb_loading); } private void initController() { mController = new Controller(new Model()); mController.addOutboxHandler(new Handler(this)); // messages will go to .handleMessage() mController.getInboxHandler().sendEmptyMessage(V_REQUEST_DATA); // request initial data } @Override protected void onDestroy() { // I think it is a good idea to not fail in onDestroy() try { mController.dispose(); } catch (Throwable t) { Logger.e("Failed to destroy the mController", t); } super.onDestroy(); } @Override public boolean handleMessage(Message msg) { Logger.d("Received message: " + msg); switch (msg.what) { case C_QUIT: onQuit(); return true; case C_DATA: onData((ModelData) msg.obj); return true; case C_UPDATE_STARTED: onUpdateStarted(); return true; case C_UPDATE_FINISHED: onUpdateFinished(); return true; } return false; } private void onUpdateStarted() { mLoadingPB.setVisibility(View.VISIBLE); } private void onUpdateFinished() { mLoadingPB.setVisibility(View.GONE); // request the updated data mController.getInboxHandler().sendEmptyMessage(V_REQUEST_DATA); } private void onData(ModelData data) { mDataTV.setText("The answer is " + data.getAnswer()); } private void onQuit() { Logger.d("Activity quitting"); finish(); } public void onClick(View v) { switch (v.getId()) { case R.id.update: mController.getInboxHandler().sendEmptyMessage(V_REQUEST_UPDATE); break; case R.id.quit: mController.getInboxHandler().sendEmptyMessage(V_REQUEST_QUIT); break; } } }