WebVR

AFrame 优雅的开发app

2018-06-29  本文已影响0人  半只温柔

框架结构和使用demo:

aframe.PNG
小广告:微笑明信片 备案中...
项目里面有框架的使用方式,不好的地方欢迎大家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里
:)

上一篇 下一篇

猜你喜欢

热点阅读