AFrame 优雅的开发app
2018-06-29 本文已影响0人
半只温柔
框架结构和使用demo:
小广告:微笑明信片 备案中...
项目里面有框架的使用方式,不好的地方欢迎大家issues :)
项目地址:https://github.com/woaigmz/AFrame
框架内容:mvp 、retrofit2 、rxjava2 、okhttp3、butterkinfe、NetworkStateView、LazyFragment 、PermissionUtil等
宗旨:让app开发更简单
使用:
1: root build.gradle at the end of repositories:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
2: Add the dependency
compile 'com.github.woaigmz:AFrame:0.0.4'
3: 创建IApiService (因为AFrame用到retrofit,网络权限可以不添加AFrame的manifest里已经声明过了)
public interface IApiService {
//首页获取明信片推荐列表
@POST("getCardList")
@FormUrlEncoded
Observable<BaseResult<CardListBean>> getCardList(@Field("name") String name, @Field("page") String page, @Field("max") String max);
}
4:创建App 继承BaseApp (注意:主项目的manifest的application里android:name=".App")
public class App extends BaseApp {
@Override
public void onCreate() {
super.onCreate();
}
}
5:初始化代理(在你的App里)
public class App extends BaseApp {
@Override
public void onCreate() {
super.onCreate();
AFrameProxy.getInstance().initAFrame(new AFrameBinder() {
@Override
public String getServerHost() {
return "http://118.89.233.211:3000/api";
}
@Override
public Class getApiService() {
return IApiService.class;
}
});
}
}
6: 网络请求部分(使用rxjava)
AFrameProxy.getInstance().<IApiService>createService() 时创建 apiservice 的关键方法
public class MainModel implements MainContract.IMainModel {
public static IBaseModel newInstance() {
return new MainModel();
}
@Override
public Observable<List<CardListBean.CardBean>> getCardList() {
// 用户 user:"111" 页数 pang:"0" 点赞量大于 max:"0"
return AFrameProxy.getInstance().<IApiService>createService().getCardList("111", "0","0").compose(RxUtils.<CardListBean>transform()).map(new Function<CardListBean, List<CardListBean.CardBean>>() {
@Override
public List<CardListBean.CardBean> apply(CardListBean cardListBean) throws Exception {
return cardListBean.getCardList();
}
});
}
}
7:mvp的使用:
contract:
public interface MainContract {
interface IMainView extends IBaseView {
void showCardList(List<CardListBean.CardBean> cardBeanList);
}
interface IMainModel extends IBaseModel {
Observable<List<CardListBean.CardBean>> getCardList();
}
interface IMainPresenter extends IPresenter<IMainView> {
void getCardList();
}
}
model: => 第6
presenter:
public class MainPresenter extends BasePresenter<MainContract.IMainView, MainContract.IMainModel> implements MainContract.IMainPresenter {
@Override
public MainContract.IMainModel bindModel() {
return (MainContract.IMainModel) MainModel.newInstance();
}
@Override
public void getCardList() {
checkViewAttached();
mView.showLoading();
mDisposable.add(mModel.getCardList().subscribe(new Consumer<List<CardListBean.CardBean>>() {
@Override
public void accept(List<CardListBean.CardBean> cardBeanList) throws Exception {
mView.hideLoading();
if (cardBeanList == null || cardBeanList.size() == 0) {
mView.showEmptyDataView();
} else {
mView.showCardList(cardBeanList);
}
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
mView.onError(throwable.getMessage());
}
}));
}
}
view(MainActivity)
public class MainActivity extends BaseActivity implements MainContract.IMainView {
@BindView(R.id.rv)
RecyclerView rv;
MainContract.IMainPresenter presenter;
private CardListAdapter adapter;
@Override
protected int getLayoutId() {
return R.layout.activity_main;
}
@Override
protected void afterCreate(Bundle savedInstanceState) {
BorderDividerItemDecoration itemDecoration = new BorderDividerItemDecoration(this.getResources().getDimensionPixelOffset(R.dimen.border_divider_height), this.getResources().getDimensionPixelOffset(R.dimen.border_padding_spans));
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
rv.setLayoutManager(staggeredGridLayoutManager);
rv.addItemDecoration(itemDecoration);
adapter = new CardListAdapter();
presenter = new MainPresenter();
presenter.onAttach(this);
rv.setAdapter(adapter);
presenter.getCardList();
}
@Override
protected void onDestroy() {
super.onDestroy();
presenter.onDetach();
}
@Override
public void onNetworkViewRefresh() {
super.onNetworkViewRefresh();
ToastUtil.showShortToast("重新请求中...");
presenter.getCardList();
}
@Override
public void showLoading() {
showLoadingView();
}
@Override
public void hideLoading() {
showContentView();
}
@Override
public void onError(String message) {
ToastUtil.showShortToast(message);
showErrorView();
}
@Override
public void showEmptyDataView() {
showEmptyView();
}
@Override
public void showCardList(List<CardListBean.CardBean> cardBeanList) {
if (adapter!=null)
adapter.replaceData(cardBeanList);
}
}
8: AFrameProxy补充说明:
IProxy定义代理的行为,AFrameBinder 绑定AFrame初始化的状态,状态行为都时可扩展的
proxy:
public class AFrameProxy implements IProxy {
private AFrameBinder binder;
private Retrofit retrofit;
private AFrameProxy() {
}
private void initRetrofit() {
retrofit = new Retrofit.Builder().client(OkHttpHelper.getInstance().getClient())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.baseUrl(binder.getServerHost()).build();
}
public AFrameBinder getBinder() {
return binder;
}
private static class Holder {
private static final AFrameProxy IN = new AFrameProxy();
}
public static AFrameProxy getInstance() {
return Holder.IN;
}
@Override
public void initAFrame(AFrameBinder binder) {
this.binder = binder;
initRetrofit();
}
@Override
public <T> T createService() {
return (T) retrofit.create(binder.getApiService());
}
}
binder:
public interface AFrameBinder {
String getServerHost();
Class getApiService();
// .... 可添加
}
action:
public interface IProxy {
void initAFrame(AFrameBinder binder);
<T> T createService();
// .....可添加
}
因为每个项目的定义不同,一些处理网络请求状态码的代码和rxjava相关的工具类放在了app里的utils里
:)