大话Philm的从无到有(二)满月篇

来源:互联网 发布:php新闻发布系统教程 编辑:程序博客网 时间:2024/04/28 07:44

在版本号962e435中,Philm已见雏形,让我们来看看这个版本中都有什么变化

Controller的变化

  1. MoviewController 扩展了MoviewController, 在里面有了实际的逻辑业务,通过FetchLibraryRunnable来获得Movie的Library。FetchLibraryRunnable继承自BackgroundRunnable
public abstract class BackgroundRunnable<R> implements Runnable {    private static final Handler sHandler = new Handler(Looper.getMainLooper());    @Override    public final void run() {   Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);        final R result = runAsync();        sHandler.post(new Runnable() {            @Override            public void run() {                postExecute(result);            }        });    }    public abstract R runAsync();    public void postExecute(R result) {    }}

BackgroundRunnable中实现了Run方法,首先执行runAsync函数执行任务,再通过MainHandler在在Ui线程中执行postExecute函数(其实也可以用AsyncTask来实现也未尝不可)

  1. UserController : 新增加了UserConroller类,里面实现了用户登陆相关的业务逻辑,一个电影类应用,怎么能没有用户的概念呢
public class UserController extends BaseUiController<UserController.UserUi,        UserController.UserUiCallbacks> {    public interface UserUi extends BaseUiController.Ui<UserUiCallbacks> {    }    public interface UserUiCallbacks {        void login(String username, String password);    }    public interface UserControllerProvider {        UserController getUserController();    }    private final UserState mUserState;    private final Display mDisplay;    public UserController(Display display, UserState userState) {        super();        mDisplay = Preconditions.checkNotNull(display, "display cannot be null");        mUserState = Preconditions.checkNotNull(userState, "userState cannot be null");    }    @Override    protected void onInited() {        super.onInited();        mUserState.registerForEvents(this);    }    private boolean validCredentials() {        return !TextUtils.isEmpty(mUserState.getUsername())                && !TextUtils.isEmpty(mUserState.getHashedPassword());    }    @Override    protected void onSuspended() {        super.onSuspended();        mUserState.unregisterForEvents(this);    }    void doLogin(String username, String password) {        // TODO: Hash password    }    @Override    protected UserUiCallbacks createUiCallbacks() {        return new UserUiCallbacks() {            @Override            public void login(String username, String password) {                doLogin(username, password);            }        };    }}
  • 接口UserUiCallbacks是在UserController中定义和实现,在View中调用,来完成用户的Login过程的,其最终是调用的UserController函数中的doLogin函数来完成Login过程的
  • 接口UserControllerProvider,将会被Activity实现,给Fragment提供UserController接口,同样的在MovieController也实现了类似的函数

    1. MainController
      MainController新增的Conroller,用来包裹MovieController和UserController,以后肯定也有其他的Controller要被放到MainController中。

State的变化

  1. 新增了UserState :继承自BaseState,同样是一个接口类,提供几个和用户Model相关的函数,将会在ApplicationState中实现
  2. 变更了MovieState :只是函数名称的变更,略去
  3. 变更了ApplicationState:ApplicationState实现了BaseState、MovieState和UserState,在整体中相当于Model,其变量mLibrary、mUsername和mHashedPassword分别起到持久化数据的作用,保存实例对象的作用。其在PhilmActivity实例化的对象会在MovieController和UserController的构造函数实例化时,作为参数传入,每个Controller只用其对应的State提供的函数接口

    Display(新增)

public class Display {    private final Activity mActivity;    public Display(Activity activity) {        mActivity = Preconditions.checkNotNull(activity, "activity cannot be null");    }    public void showLibrary() {        CollectionListFragment fragment = new CollectionListFragment();        mActivity.getFragmentManager().beginTransaction()                .replace(R.id.fragment_main, fragment)                .commit();    }    public void showLogin() {        LoginFragment fragment = new LoginFragment();        mActivity.getFragmentManager().beginTransaction()                .replace(R.id.fragment_main, fragment)                .commit();    }}

从代码中可以看出来,它是起到了控制Fragment在Activity中显示的作用,PhilmActivity的Layout文件中有一个Fragment,被有功能性的Fragment不断地进行替换。一个Activity就可以实现View的所有功能。

另外还新增了一个MovieGridAdapter,这个肯定是Movie视图的Adapter,目前实现很简单。

借用别人的一张图说明这几个模块在整个程序中的关系

0 0
原创粉丝点击