这个项目是用来学习一个基于MVP+Retrofit+RxJava+MaterialDesign和gank.io的MeiZhi客户端的。
这个项目只有四个界面:SplashActivity,HomeActivity,GirlActivity,AboutActivity。每一个界面都是使用的内嵌一个Fragment来实现的。
使用的是mvp的基本架构,将model(数据)层和View(界面展示)层分离开来,通过Presenter(业务处理)层将其连系起来。
mvp结构例如:
- splash
* SplashActivity
* SplashContract //契约类
* SplashFragment
* SplashPresenter
贴上一个契约类的代码:
public interface SplashContract {
interface View extends BaseView<Presenter> {
void showGirl(String girlUrl);
void showGirl();
}
interface Presenter extends BasePresenter {
}
}
在网络请求上面使用的是Retrofit + Rxjava的这种方式:
接口定义:
public interface GirlsService {
@GET("api/data/{type}/{count}/{page}")
Observable<GirlsBean> getGirls(@Path("type") String type, @Path("count") int count,
@Path("page") int page);
}
使用Retrofit对每一个接口进行具体的实现 + 数据回调处理,没有使用Lambda:
public class RemoteGirlsDataSource implements GirlsDataSource {
@Override
public void getGirls(int page, int size, final LoadGirlsCallback callback) {
GirlsRetrofit.getRetrofit()
.create(GirlsService.class)
.getGirls("福利", size, page)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<GirlsBean>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
callback.onDataNotAvailable();
}
@Override
public void onNext(GirlsBean girlsBean) {
callback.onGirlsLoaded(girlsBean);
}
});
}
@Override
public void getGirl(LoadGirlsCallback callback) {
getGirls(1, 1, callback);
}
}
HandlerThread的特点:
- HandlerThread本质上是一个线程类,它继承自Thread;
- HandlerThread有自己的内部Looper对象,可以进行looper循环;
- 通过获取HandlerThread的looper对象传递给Handler对象,可以在handleMessage方法中执行异步任务;
- 创建HandlerThread后必须先调用HandlerThread.start()方法,Thread会先调用run方法,创建Looper对象。
- HandlerThread内部有一个Looper成员变量和Handler成员变量,它维持了一套消息循环系统;当然在使用的时候,我们可以只使用它的Looper来自己new出来一个Handler。
public class HandlerThread extends Thread {
...
}
具体见HandlerThread-Review.md以及其module。
IntentService的特点:
- IntentService继承自Service,并且是一个抽象类
- 它可以用于在后台执行耗时的异步任务,当任务完成后会自动停止
- 它拥有较高的优先级,不易被系统杀死(继承自Service的缘故),因此比较适合执行一些高优先级的异步任务
- 它内部通过HandlerThread和Handler实现异步操作
- 创建IntentService时,只需实现onHandleIntent和构造方法,onHandleIntent为异步方法,可以执行耗时操作
public abstract class IntentService extends Service {
...
}
具体见IntentService-Review.md以及其module。
λ表达式由三部分组成:参数列表,箭头(->),以及一个表达式或语句块。
λ表达式可以被当做是一个Object(注意措辞)。λ表达式的类型,叫做“目标类型(target type)”。
λ表达式的目标类型是“函数接口(functional interface)”,这是Java8新引入的概念。
它的定义是:一个接口,如果只有一个显式声明的抽象方法,那么它就是一个函数接口。一般用@FunctionalInterface标注出来(也可以不标)。举例如下:
@FunctionalInterface
public interface Runnable{void run();}
public interface Callable<V>{ V call() throws Exception;}
public interface ActionListener{ void actionPerformed(ActionEvent e);}
public interface Comparator<T>{ int compare(T o1,T o2);boolean equals(Object obj);}
可以用一个λ表达式为一个函数接口赋值,例如:
Runnable r1 = () -> {System.out.println("Hello Lambda!");};
//然后再赋值给一个Object
Object obj = r1;
详细见lambda-learn.md以及其module。