- 运行在onCreateView之后
- 加载数据
- @param savedInstanceState
/
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mPresenter.attachView(this);
}
/* - 跳转Fragment
- @param toFragment 跳转去的fragment
/
public void startFragment(Fragment toFragment) {
Log.d(TAG, “haha”);
startFragment(toFragment, null);
}
/* - 跳转Fragment
- @param toFragment 跳转到的fragment
- @param tag fragment的标签
/
public void startFragment(Fragment toFragment, String tag) {
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.hide(this).add(android.R.id.content, toFragment, tag);
fragmentTransaction.addToBackStack(tag);
fragmentTransaction.commitAllowingStateLoss();
}
@Override
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
}
/* - fragment进行回退
- 类似于activity的OnBackPress
/
public void onBack() {
getFragmentManager().popBackStack();
}
@Override
public void onDetach() {
mPresenter.detachView();
super.onDetach();
}
/* - 初始化Fragment应有的视图
- @return view
/
public abstract View initView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState);
/* - 创建presenter
- @return 必须是BasePresenter的子类
/
public abstract T initPresenter();
/* - 得到context
- @return context
/
@Override
public Context getContext() {
return mContext;
}
/* - 得到bundle
- @return bundle
/
public Bundle getBundle() {
return mBundle;
}
/* - 得到fragment
- @return fragment
*/
public Fragment getFragment() {
return this;
}
}`
2.1.5 BasePresenter
Presenter
的基类,
CompositeDisposable
主要用途是及时取消订阅,以防止内存泄漏,具体CompositeDisposable
的用法可参照Rxjava关于Disposable你应该知道的事
`/**
- created by xucanyou666
- on 2020/1/16 17:12
- email:913710642@qq.com
/
public abstract class BasePresenter {
//将所有正在处理的Subscription都添加到CompositeSubscription中。统一退出的时候注销观察
private CompositeDisposable mCompositeDisposable;
private V baseView;
/* - 和View绑定
- @param baseView
/
public void attachView(V baseView) {
this.baseView = baseView;
}
/* - 解绑View,该方法在BaseMvpActivity类中被调用
/
public void detachView() {
baseView = null;
// 在界面退出等需要解绑观察者的情况下调用此方法统一解绑,防止Rx造成的内存泄漏
if (mCompositeDisposable != null) {
mCompositeDisposable.dispose();
}
}
/* - 获取View
- @return view
/
public V getMvpView() {
return baseView;
}
/* - 将Disposable添加,在每次网络访问之前初始化时进行添加操作
- @param subscription subscription
*/
public void addDisposable(Disposable subscription) {
//csb 如果解绑了的话添加 sb 需要新的实例否则绑定时无效的
if (mCompositeDisposable == null || mCompositeDisposable.isDisposed()) {
mCompositeDisposable = new CompositeDisposable();
}
mCompositeDisposable.add(subscription);
}
}`
2.1.6 MyApplication
- 封装了一个可以全局获取
Context
的方法,参考写法自:《第一行代码–第二版》- 注意:记得在
AndroidManifest
中注册Application
`package com.users.xucanyou666.rxjava2_retrofit_mvp.base;
import android.app.Application;
import android.content.Context;
/**
- 基类
- created by xucanyou666
- on 2019/11/2 14:46
- email:913710642@qq.com
- @author xucanyou666
*/
public class MyApplication extends Application {
private static Context context;
@Override
public void onCreate() {
super.onCreate();
context = getApplicationContext();
}
public static Context getContext() {
return context;
}
}`
2.2 工具类 Util
2.2.1 RetrofitManager
Retrofit
单例工具类
`/**
- Retrofit单例工具类
- created by xucanyou666
- on 2020/1/16 16:38
- email:913710642@qq.com
/
public class RetrofitManager {
private Retrofit mRetrofit;
//构造器私有,这个工具类只有一个实例
private RetrofitManager() {
OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder();
httpClientBuilder.connectTimeout(15, TimeUnit.SECONDS);
mRetrofit = new Retrofit.Builder()
.client(httpClientBuilder.build())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.baseUrl(BASE_URL)
.build();
}
/* - 静态内部类单例模式
- @return
/
public static RetrofitManager getInstance() {
return Inner.retrofitManager;
}
private static class Inner {
private static final RetrofitManager retrofitManager = new RetrofitManager();
}
/* - 利用泛型传入接口class返回接口实例
- @param ser 类
- @param 类的类型
- @return Observable
*/
public T createRs(Class ser) {
return mRetrofit.create(ser);
}
}`
2.2.2 RxJavaUtil
RxJava
的工具类,执行线程调度工作
`/**
- created by xucanyou666
- on 2019/11/17 19:20
- email:913710642@qq.com
- @author xucanyou666
/
public class RxJavaUtil {
/* - 线程调度工作
- @param observable 被观察者
- @param 类型
*/
public static Observable toSubscribe(Observable observable) {
return observable.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
}`
2.3 常量类 Contant
常量池,特别感谢
api open
网提供的免费API
`/**
- created by xucanyou666
- on 2019/11/17 19:01
- email:913710642@qq.com
*/
public class StaticQuality {
public static final String BASE_URL=“https://api.gushi.ci/”;
}`
2.4 接口管理器 Contract
这里集中了一些
Model
层,Presenter
层,View
层的与诗歌相关的接口
`/**
- 诗歌的接口管理器
- created by xucanyou666
- on 2020/2/2 15:33
- email:913710642@qq.com
/
public interface IPoetryContract {
interface IPoetryModel {
/* - 得到诗歌
- @return 诗歌
/
Observable getPoetry();
}
interface IPoetryPresenter {
void getPoetry();
}
interface IPoetryView extends BaseView {
/* - @param author 作者
*/
void searchSuccess(String author);
}
}`
2.5 实体类 Entity
`/**
- 诗歌的实体类
- created by xucanyou666
- on 2020/1/23 21:23
- email:913710642@qq.com
- API返回示例:
- {
- “content”: “胡瓶落膊紫薄汗,碎叶城西秋月团。”,
- “origin”: “从军行七首”,
- “author”: “王昌龄”,
- “category”: “古诗文-天气-月亮”
- }
*/
public class PoetryEntity {
private String content; //诗歌内容
private String origin; //来源
private String author; //作者
private String category; //分类
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getOrigin() {
return origin;
}
public void setOrigin(String origin) {
this.origin = origin;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
}`
2.6 Retrofit
接口 iApiService
`/**
- retrofit接口
- created by xucanyou666
- on 2020/1/23 21:25
- email:913710642@qq.com
/
public interface GetPoetryEntity {
/* - 获取古诗词
- @return 古诗词
*/
@GET(“all.json”)
Observable getPoetry();
}`
2.7 视图层 View
这里为了减少代码量,方便读者们掌握核心操作,故
View
层都是用的同一个Presenter
和Model
,仅作学习参考
2.7.1 MainActivity
需要注意的是,这里
BaseMvpActivity<activity, presenter>
中Activity
填入的是当前的Activity
,Presenter
填入的是对应的Presenter
`/**
- Description : MainActivity
- @author XuCanyou666
- @date 2020/2/3
*/
public class MainActivity extends BaseMvpActivity<MainActivity, PoetryPresenter> implements IPoetryContract.IPoetryView {
@BindView(R.id.btn_get_poetry)
Button btnGetPoetry;
@BindView(R.id.tv_poetry_author)
TextView tvPoetryAuthor;
@BindView(R.id.btn_goto_fragment)
Button btnGotoFragment;
@BindView(R.id.ll)
LinearLayout ll;
@Override
protected void initViews() {
}
@Override
protected int getLayoutId() {
return R.layout.activity_main;
}
@Override
protected PoetryPresenter createPresenter() {
return PoetryPresenter.getInstance();
}
@Override
public void searchSuccess(String author) {
tvPoetryAuthor.setText(author);
}
@Override
public void showProgressDialog() {
}
@Override
public void hideProgressDialog() {
}
@Override
public void onError(String result) {
Toast.makeText(MyApplication.getContext(), result, Toast.LENGTH_SHORT).show();
}
@OnClick({R.id.btn_get_poetry, R.id.btn_goto_fragment})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.btn_get_poetry:
getPresenter().getPoetry();
break;
case R.id.btn_goto_fragment:
startFragment(R.id.ll, new MainFragment());
break;
default:
break;
}
}
}`
2.7.2 MainFragment
`/**
- Description : MainFragment
- @author XuCanyou666
- @date 2020/2/2
*/
public class MainFragment extends BaseFragment implements IPoetryContract.IPoetryView {
@BindView(R.id.btn_get_poetry)
Button btnGetPoetry;
@BindView(R.id.tv_poetry_author)
TextView tvPoetryAuthor;
@Override
public View initView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_main, container, false);
}
@Override
public PoetryPresenter initPresenter() {
return PoetryPresenter.getInstance();
}
@Override
public void showProgressDialog() {
}
@Override
public void hideProgressDialog() {
}
@Override
public void onError(String result) {
Toast.makeText(MyApplication.getContext(), result, Toast.LENGTH_SHORT).show();
}
@OnClick(R.id.btn_get_poetry)
public void onViewClicked() {
getPresenter().getPoetry();
}
@Override
public void searchSuccess(String author) {
tvPoetryAuthor.setText(author);
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
最后
今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。
最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司20年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。
还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
【Android核心高级技术PDF文档,BAT大厂面试真题解析】
【算法合集】
【延伸Android必备知识点】
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。
还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
【Android核心高级技术PDF文档,BAT大厂面试真题解析】
[外链图片转存中…(img-l2sASPi4-1712728079980)]
【算法合集】
[外链图片转存中…(img-UZjh2Ki6-1712728079981)]
【延伸Android必备知识点】
[外链图片转存中…(img-l9xqhTKF-1712728079981)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-lLf4kvo4-1712728079981)]