在线视频播放
搜索
分类
全屏
评论列表
收藏数
分享数
分享
热门搜索词
清除缓存
每日图片
效果图如下:
以上四张效果图,仅仅展示了主页的UI,本想录制视频,但是都超过了大小限制,无法上传。
以上效果图以及整个在线视频APP的代码,仅仅作为学习交流之用,不可用于任何商业之用,由此出现的任何问题与作者本人无关!
整个APP的架构设计模块化开发,大的方向上设计四个模块,分别对应首页的四个fragment。
if (isNeedHomeModule.toBoolean()) {
api project(':module_home')
}
if (isNeedChatModule.toBoolean()) {
api project(':module_chat')
}
if (isNeedRecomModule.toBoolean()) {
api project(':module_recom')
}
if (isNeedMeModule.toBoolean()) {
api project(':module_me')
}
以上四个模块作为APP的主要模块,四个模块之间不可直接交互应用,他们之间的交互全部通过ARouter路由进行。
在这四个模块之下,有lib_icon模块、lib_base模块、network模块,这三个模块为以上四个主要模块提供支持。
lib_icon模块提供整个APP的资源支持,公共资源均可以放在这里
lib_base模块提供主要代码级别的支持,主要基类,公用类等
network模块提供整个APP的网络请求支持
另外需要说明的是,上面的四个主要模块可以作为APP主要的入口,由此四个模块可单独运行测试,如果在APP体量特别大的情况下,能够单独运行,大大减小测试开发力度。这也是ARouter的一个好处。
public interface IView {
}
public interface IPresenter {
/**
* destroy
*/
void destroy();
}
public abstract class BasePresenter<T extends IView> implements IPresenter {
protected T iView;
public BasePresenter(T iView) {
this.iView = iView;
}
@Override
public void destroy() {
iView = null;
}
}
以上涉及IView接口扩展整个UI包括activity和fragment。
BasePresenter抽象类类实现UI相关的逻辑
举例欢迎页
public interface LaunchContract {
interface LaunchView extends IView {
/**
* 设置首页图片
* @param url string
*/
void showFlash(String url);
/**
* load launch fail
*/
void loadLaunchFail();
}
interface LaunchPresenter {
/**
* 获取图片
*/
void getImage();
}
}
欢迎页LaunchContract 接口包括了两个接口,这两个接口中声明了UI和presenter交互的接口,实现类中实现这两个接口即可,并且,view和presenter的交互只有以上声明的方法才能调用,这样逻辑清晰。
欢迎页实现类如下:
public class LaunchActivity extends BaseActivity implements LaunchContract.LaunchView {
private static final int SLEEP_TIME = 6000;
private static final int REQUEST_PERMISSION_SETTING = 99;
@BindView(R.id.splash_root)
ImageView mSplashRoot;
private LaunchPresenter mLaunchPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_launch);
mUnBinder = ButterKnife.bind(this);
mLaunchPresenter = new LaunchPresenter(this);
requestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE);
}
@Override
public void showFlash(String url) {
GlideUtil.Companion.showImage(LaunchActivity.this, mSplashRoot, url, new GlideUtil.Companion.ImageListener() {
@Override
public void onFailed() {
}
@Override
public void onReady(@NotNull Drawable resource) {
runAlphaAnim(resource);
}
});
}
....................................
}
LaunchActivity 类实现LaunchContract.LaunchView接口,声明LaunchPresenter对象
public class LaunchPresenter extends BasePresenter<LaunchContract.LaunchView> implements LaunchContract.LaunchPresenter {
public LaunchPresenter(LaunchContract.LaunchView iView) {
super(iView);
}
@Override
public void getImage() {
}
}
LaunchPresenter 类实现LaunchContract.LaunchPresenter接口
以上整个MVP的逻辑架构,将逻辑与UI分离,代码更加清晰。
Java1.8
Kotlin
Android 28
Android build tools 28.0.3
Android Studio 3.5
Gradle plugin tool version 3.1.0
Gradle 4.10.1
// a router
api "com.alibaba:arouter-api:${rootProject.ext.arouter_api_v}"
kapt "com.alibaba:arouter-compiler:${rootProject.ext.arouter_compile_v}"
// fast json
api "com.alibaba:fastjson:${rootProject.ext.fast_json_v}"
// retrofit
api "com.squareup.retrofit2:retrofit:${rootProject.ext.retrofit_v}"
api "com.squareup.retrofit2:converter-gson:${rootProject.ext.retrofit_v}"
// butter knife
api "com.jakewharton:butterknife:${rootProject.ext.butter_knife_v}"
kapt "com.jakewharton:butterknife-compiler:${rootProject.ext.butter_knife_v}"
// leak canary
debugApi "com.squareup.leakcanary:leakcanary-android:${rootProject.ext.leakcanary_v}"
releaseApi "com.squareup.leakcanary:leakcanary-android-no-op:${rootProject.ext.leakcanary_v}"
debugApi "com.squareup.leakcanary:leakcanary-support-fragment:${rootProject.ext.leakcanary_v}"
// rxjava
api "io.reactivex.rxjava2:rxjava:${rootProject.ext.rxjava_v}"
api "io.reactivex.rxjava2:rxandroid:${rootProject.ext.rxandroid_v}"
api 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
//android event bus
api "org.simple:androideventbus:${rootProject.ext.android_event_bus_v}"
// event bus
api "org.greenrobot:eventbus:${rootProject.ext.eventbus_v}"
//glide
api("com.github.bumptech.glide:glide:${rootProject.ext.glide_v}") {
exclude group: "com.android.support"
}
annotationProcessor "com.github.bumptech.glide:compiler:${rootProject.ext.glide_v}"
kapt "com.github.bumptech.glide:compiler:${rootProject.ext.glide_v}"
api "com.android.support:multidex:${rootProject.ext.multidex_v}"
api 'com.youth.banner:banner:1.4.10'
api 'com.hyman:flowlayout-lib:1.1.2'
api 'cn.jzvd:jiaozivideoplayer:7.0.5'
api 'cn.carbs.android:ExpandableTextView:1.0.3'
代码就不公开了,想要源代码的同学,给我发邮件吧([email protected])
再次声明,代码仅仅学习之用,严禁商业之用~!
欢迎关注公众号:技术印象