最近收到本书《Android App开发入门与实战》的一些读者的反馈,希望书籍最后章节的GitHub客户端实战开发环节能否单独拿出来讲解一遍,最好能通过视频形式展示出来。于是这段时间把GitHub客户端开发教程重新整理了一遍,并录制成视频。
这是第6篇,本篇正式进入编码阶段,首先介绍架构和模块的搭建。
本章节建议观看视频讲解。
微信搜索 【国民程序员】,回复 “github”,即可获取本项目源码和后续完整的实战文章教程。
文章目录
-
一、架构
-
- 1. MVVM
-
二、模块
-
- 1. 网络
-
2. 图片
-
3. 数据库
-
4. base
-
5. 数据
-
6. 其它
==============================================================
BaseViewModel是业务VM的基类;
public abstract class BaseViewModel extends AndroidViewModel {
protected Context context;
protected T repository;
public BaseViewModel(@NonNull Application application) {
super(application);
context = application;
repository = TUtil.getInstance(this, 0);
}
}
BaseRepository是业务Model的基类;
public abstract class BaseRepository {
private final String TAG = “BaseRepository”;
protected MutableLiveData<Data> liveDataLogin;
public void login(String authorization) {
… …
}
}
(附)AppRepository处理跟数据相关的业务入口;
==============================================================
public enum RetrofitManager {
INSTANCE;
private final String TAG = “RetrofitManager”;
private HashMap<String, Retrofit> retrofitMap = new HashMap<>();
private void createRetrofit(@NonNull String baseUrl, boolean isJson) {
int timeOut = Constant.HTTP_TIME_OUT;
Cache cache = new Cache(FileUtil.getHttpImageCacheDir(MyApplication.getInstance()),
Constant.HTTP_MAX_CACHE_SIZE);
// Log信息拦截器
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);//这里可以选择拦截级别
OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder()
.connectTimeout(timeOut, TimeUnit.MILLISECONDS)
.addInterceptor(loggingInterceptor)
.cache(cache);
if (!StringUtil.isEmpty(App.sAuthorization)) {
okHttpClientBuilder.interceptors().add(0, chain -> {
Request.Builder reqBuilder = chain.request()
.newBuilder().addHeader(“Authorization”, App.sLastLoginUser.getToken());
return chain.proceed(reqBuilder.build());
});
}
Retrofit.Builder builder = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())//定义转化器,用Gson将服务器返回的Json格式解析成实体
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())//关联RxJava
.client(okHttpClientBuilder.build());
if (isJson) {
builder.addConverterFactory(GsonConverterFactory.create());
} else {
builder.addConverterFactory(SimpleXmlConverterFactory.createNonStrict());
}
retrofitMap.put(baseUrl + “-” + isJson, builder.build());
}
/**
-
区分登录态的Retrofit
-
@param baseUrl
-
@param withLogin
-
@return
*/
public Retrofit getRetrofit(@NonNull String baseUrl, boolean withLogin) {
String key = baseUrl + “-” + withLogin;
if (!retrofitMap.containsKey(key)) {
createRetrofit(baseUrl, withLogin);
}
return retrofitMap.get(key);
}
public Retrofit getRetrofit(@NonNull String baseUrl) {
return getRetrofit(baseUrl, true);
}
}
QuickModule:自动切换功能模块的实现方式,以图片模块为例。
QuickModule.imageProcessor().loadNet(url, mImageView);
public class QuickModule {
private static IImageProcessor mIImageProcessor;
private static ImageConfig mImageConfig;
//配置生效
public static void launch() {
//image
if (mIImageProcessor == null) {
mIImageProcessor = new GlideProcessor();
}
mIImageProcessor.init(MyApplication.getInstance(), mImageConfig);
}
//image调用入口
public static T imageProcessor() {
if (mIImageProcessor != null) {
return (T) mIImageProcessor;
}
return (T) new GlideProcessor();
}
//image配置入口
public static ImageConfig configImage() {
return configImage(null);
}
//image配置入口
public static ImageConfig configImage(IImageProcessor processor) {
if (processor == null) {
mImageConfig = new ImageConfig();
}
else {
mIImageProcessor = processor;
mImageConfig = new ImageConfig();
}
return mImageConfig;
}
}
Room主要由三部分组成:Database、Entity、Dao。
public abstract class BaseActivity extends QuickActivity {
//默认不使用自带titlebar
@Override
protected boolean isLoadDefaultTitleBar() {
return false;
}
@Override
protected void getBundleExtras(Bundle extras) {
}
//默认不开启eventbus
@Override
protected boolean isBindEventBus() {
return false;
}
@Override
protected void onEventComing(EventCenter eventCenter) {
}
@Override
protected Intent getGoIntent(Class<?> clazz) {
if (BaseFragment.class.isAssignableFrom(clazz)) {
Intent intent = new Intent(this, FragmentActivity.class);
intent.putExtra(“fragmentName”, clazz.getName());
return intent;
} else {
return super.getGoIntent(clazz);
}
}
}
public abstract class MVVMActivity extends BaseActivity {
protected T mViewModel;
public T getViewModel() {
return mViewModel;
}
public Class getTClass() {
try {
return (Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void initViewsAndEvents(Bundle savedInstanceState) {
if (mViewModel == null) {
Class clazz = getTClass();
if (clazz != null) {
mViewModel = ViewModelProviders.of(this).get(getTClass());
}
}
}
}
状态 + 泛型 + msg
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
,自己不成体系的自学效果低效漫长且无助**。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-mpxdqdyM-1715789435223)]
[外链图片转存中…(img-hfAELO93-1715789435224)]
[外链图片转存中…(img-qwsMyrfJ-1715789435225)]
[外链图片转存中…(img-RZt0U7Oc-1715789435226)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!