2024年Android最全项目实战之Rxjava、RxBinding在实际项目中的使用,高级别面试

尾声

最后,我再重复一次,如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究。

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

最后想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。

进阶学习视频

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

Observable.combineLatest(name, age, new BiFunction<CharSequence, CharSequence, Boolean>() {
@Override
public Boolean apply(CharSequence charSequence, CharSequence charSequence2) throws Exception {

boolean isNameEmpty = TextUtils.isEmpty(mBinding.etName.getText());
boolean isAgeEmpty = TextUtils.isEmpty(mBinding.etAge.getText());

return !isNameEmpty && !isAgeEmpty;
}
})
.subscribe(new Consumer() {
@Override
public void accept(Boolean aBoolean) throws Exception {
System.out.println(“bt======” + aBoolean);
mBinding.btSubmit.setEnabled(aBoolean);
}
});

7、使用interval做周期性操作

/**

  • 每隔2秒 输出一次日志
    */
    Disposable mDisposable;
    public void clickIntervar(View view) {

Observable.interval(2, TimeUnit.SECONDS)
.subscribe(new Observer() {
@Override
public void onSubscribe(Disposable d) {
mDisposable =d;

}

@Override
public void onNext(Long value) {
System.out.println(“binding=输出日志:" + value);
if (value == 5L) {
System.out.println("binding
=dispose”);
mDisposable.dispose();
}
}

@Override
public void onError(Throwable e) {

}

@Override
public void onComplete() {

}
});
}

8、使用schedulePeriodically做轮询请求

/**

  • 使用schedulePeriodically做轮询请求 3秒轮询一次
    */
    Observable.create(new ObservableOnSubscribe() {
    @Override
    public void subscribe(final ObservableEmitter e) throws Exception {

Schedulers.newThread().createWorker()
.schedulePeriodically(new Runnable() {
@Override
public void run() {
e.onNext(“net work-----”);
}
}, 0, 3, TimeUnit.SECONDS);

}
}).subscribe(new Consumer() {
@Override
public void accept(String s) throws Exception {
System.out.println(“binding=======net work”);
}
});

9、网络出错重试

/**

  • 网络错误重试
  • 这里just操作符 改为retrofit 网络请求返回的即可。
    */
    int mRetryCount;

public void clickRetry(View view) {
Observable.just(“retry”)
.retryWhen(new Function<Observable, ObservableSource<?>>() { @Override public ObservableSource<?> apply(Observable throwableObservable) throws Exception {

// 参数Observable中的泛型 = 上游操作符抛出的异常,可通过该条件来判断异常的类型
return throwableObservable.flatMap(new Function<Throwable, ObservableSource<?>>() { @Override public ObservableSource<?> apply(Throwable throwable) throws Exception {

// 判断异常信息 根据异常信息判断是否需要重试
if (throwable instanceof IOException) {
System.out.println(“retry====y”);
// 重试
// 判断重试次数 这里设置最多重试5次
if (mRetryCount < 5) {
mRetryCount++;
/**

  • 1、通过返回的Observable发送的事件 = Next事件,从而使得retryWhen()重订阅,最终实现重试功能
  • 2、延迟1段时间再重试 采用delay操作符 = 延迟一段时间发送,以实现重试间隔设置
  • 3、在delay操作符的等待时间内设置 = 每重试1次,增多延迟重试时间1s
    */
    int time = 1000 + mRetryCount * 1000;
    return Observable.just(1).delay(time, TimeUnit.MILLISECONDS);
    } else {
    System.out.println(“retry====5”);
    return Observable.error(new Throwable(“已重试5次 放弃治疗”));
    }

} else {
// 不重试
System.out.println(“retry====n”);
return Observable.error(new Throwable(“发生了非网络异常(非I/O异常)”));
}
}
});
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer() {
@Override
public void onSubscribe(Disposable d) {

}

@Override
public void onNext(String value) {
System.out.println(“retry====suc” + value);
}

@Override
public void onError(Throwable e) {
System.out.println(“retry====err” + e.toString());
}

@Override
public void onComplete() {

}
});

}

10、解决网络嵌套请求

/**

  • 优化网络嵌套请求问题
  • 以下为了方便演示 写的伪代码
    */
    public void clickRequest(View view) {
    Observable requestLogin = Observable.just(“requestLogin”);
    final Observable request2 = Observable.just(“request2”);

requestLogin.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(new Consumer() {
@Override
public void accept(String s) throws Exception {
System.out.println(“flat=loginsuccess");
}
})
.observeOn(Schedulers.io())
.flatMap(new Function<String, ObservableSource>() {
@Override
public ObservableSource apply(String s) throws Exception {
// 将网络请求1转换成网络请求2,即发送网络请求2
return request2;
}
})
// (新被观察者,同时也是新观察者)切换到IO线程去发起登录请求
// 特别注意:因为flatMap是对初始被观察者作变换,所以对于旧被观察者,它是新观察者,所以通过observeOn切换线程
// 但对于初始观察者,它则是新的被观察者
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer() {
@Override
public void accept(String s) throws Exception {
System.out.println("flat
=第二次请求成功”);
}
}, new Consumer() {
@Override
public void accept(Throwable throwable) throws Exception {
System.out.println(“flat=======loginerr”);
}
});
}

11、背压–这个就是记录一下

/**

  • 背压 Flowable g观察者使用
  • 解决发送和订阅事件 流速不一致的问题
  • 注意:同步订阅中,被观察者 & 观察者工作于同1线程,同步订阅关系中没有缓存区。
  • 被观察者在发送1个事件后,必须等待观察者接收后,才能继续发下1个事件.若Subscription.request没有设置,
  • 观察者接收不到事件,会抛出MissingBackpressureException异常。
    */
    Subscription mSubscription;

public void clickFlow(View view) {

Flowable.create(new FlowableOnSubscribe() {
@Override
public void subscribe(FlowableEmitter e) throws Exception {

/**

  • 同步订阅:
  • 同步订阅的情况下,调用e.requested()方法,获取当前观察者需要接收的事件数量.
  • 根据当前观察者需要接收的事件数量来发送事件
  • 异步订阅:
  • 由于二者处于不同线程,所以被观察者 无法通过 FlowableEmitter.requested()知道观察者自身接收事件能力。
  • 异步的反向控制:
    */
    long count = e.requested();
    System.out.println(“flowable======需要接收的事件数量=” + count);

e.onNext(1);
e.onNext(2);
e.onNext(3);
e.onNext(4);
e.onNext(5);
e.onComplete();
}
}, BackpressureStrategy.ERROR)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber() {
@Override
public void onSubscribe(Subscription s) {

// 作用:决定观察者能够接收多少个事件,多出的事件放入缓存区.若不设置,则不接收事件.
// 不过被观察者仍然在发送事件(存放在缓存区,大小为128),等观察者需要时 再取出被观察者事件(比如点击事件里).
// 但是 当缓存区满时 就会溢出报错
// 官方默认推荐使用Long.MAX_VALUE,即s.request(Long.MAX_VALUE);
mSubscription = s;
s.request(2);
// s.request(1); // 同步订阅 观察者连续要求接收事件的话,被观察者e.requested() 返回3
}

@Override
public void onNext(Integer integer) {

System.out.println(“flowable=======” + integer);
}

@Override
public void onError(Throwable t) {

}

@Override
public void onComplete() {

}
});

}

12、补充一个动态权限

添加依赖 compile ‘com.tbruyelle.rxpermissions2:rxpermissions:0.9.5@aar’

// 记得危险权限 清单文件里也需要配置。
// 因为各个业务组件都可能使用到危险权限,我把权限统一写在了commonLibrary里
RxPermissions permissions = new RxPermissions(this);
RxView.clicks(mBinding.btPermission)
.throttleFirst(1, TimeUnit.SECONDS)
.subscribeOn(AndroidSchedulers.mainThread())
.compose(permissions.ensure(Manifest.permission.CAMERA))
.subscribe(new Consumer() {
@Override
public void accept(Boolean aBoolean) throws Exception {
if (aBoolean) {
System.out.println(“binding=允许");
} else {
System.out.println("binding
=拒绝”);

最后

都说三年是程序员的一个坎,能否晋升或者提高自己的核心竞争力,这几年就十分关键。

技术发展的这么快,从哪些方面开始学习,才能达到高级工程师水平,最后进阶到Android架构师/技术专家?我总结了这 5大块;

我搜集整理过这几年阿里,以及腾讯,字节跳动,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 PDF(实际上比预期多花了不少精力),包含知识脉络 + 分支细节。

Java语言与原理;
大厂,小厂。Android面试先看你熟不熟悉Java语言

高级UI与自定义view;
自定义view,Android开发的基本功。

性能调优;
数据结构算法,设计模式。都是这里面的关键基础和重点需要熟练的。

NDK开发;
未来的方向,高薪必会。

前沿技术;
组件化,热升级,热修复,框架设计

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

我在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多

当然,想要深入学习并掌握这些能力,并不简单。关于如何学习,做程序员这一行什么工作强度大家都懂,但是不管工作多忙,每周也要雷打不动的抽出 2 小时用来学习。

不出半年,你就能看出变化!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多

当然,想要深入学习并掌握这些能力,并不简单。关于如何学习,做程序员这一行什么工作强度大家都懂,但是不管工作多忙,每周也要雷打不动的抽出 2 小时用来学习。

不出半年,你就能看出变化!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值