在版本号962e435中,Philm已见雏形,让我们来看看这个版本中都有什么变化
Controller的变化
- 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来实现也未尝不可)
- 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也实现了类似的函数
- MainController
MainController新增的Conroller,用来包裹MovieController和UserController,以后肯定也有其他的Controller要被放到MainController中。
- MainController
State的变化
- 新增了UserState :继承自BaseState,同样是一个接口类,提供几个和用户Model相关的函数,将会在ApplicationState中实现
- 变更了MovieState :只是函数名称的变更,略去
变更了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,目前实现很简单。
借用别人的一张图说明这几个模块在整个程序中的关系