业务首页优化记录
来源:互联网 发布:usb网络接口转换器 编辑:程序博客网 时间:2024/06/07 03:34
当界面有多个tab时,把tab做成懒加载。
好处:
- 减少View的创建。(待验证)
- 减少接口不必要的接口请求
并行请求接口
当界面有多个接口请求且界面逻辑有数据依赖时,即有先后顺序,可以从接口层面拆分为没有依赖关系。这样就可以把接口做成并行的。
预加载数据模板类实现方式见:PreLoadListStateFragment
zip操作符误区
结论:
zip操作符使用时,需要给每个Observable都加上执行线程。
1.0 zip 、 zipWith误区
正常调用如下:
long time = System.currentTimeMillis();Observable<String> observable1 = getObservable(1800);Observable<String> observable2 = getObservable(1500);Observable zip1 = observable1.zipWith(observable2, (str1, str2)->{ Log.e(TAG, "zip1 threadName=" + Thread.currentThread().getName()); return str1 + str2;});zip1.subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(obj ->Log.e(TAG, "zip observable run time=" + (System.currentTimeMillis() - time)));
将会发生什么:

从log可以看出,
1、两个Observable执行在同一个线程。
2、执行总时长大于1800 + 1500。
1.1 zip中每个Observable使用subscribeOn(Schedulers.io())处理
long time = System.currentTimeMillis();Observable<String> observable1 = getObservable(1800) .subscribeOn(Schedulers.io());Observable<String> observable2 = getObservable(1500) .subscribeOn(Schedulers.io());Observable zip1 = observable1.zipWith(observable2, (str1, str2)->{ Log.e(TAG, "zip1 threadName=" + Thread.currentThread().getName()); return str1 + str2;});zip1.subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(obj ->Log.e(TAG, "zip observable run time=" + (System.currentTimeMillis() - time)));
神奇时刻:

注意
1、两个Observable的线程名不同,
2、zip执行总时长略>1800毫秒
结论:
- 使用zip时,需要对每个Observable分别设置执行线程,否则所有Observable执行在同一个线程。
- 通过两个log可以看出zip合并线程执行在耗时最长的线程中。### 2.1 Zip 中嵌套Zip:observable1 执行1800秒,observable2 执行1500秒observable3 执行1000秒
long time = System.currentTimeMillis(); Observable<String> observable1 = getObservable(1800) .subscribeOn(Schedulers.io()); Observable<String> observable2 = getObservable(1500) .subscribeOn(Schedulers.io()); Observable<String> observable3 = getObservable(1000); Observable<String> zip = observable1.zipWith(observable2, (str1, str2) -> { Log.e(TAG, "zip threadName=" + Thread.currentThread().getName()); return str1 + str2; } ); Observable<String> zip3 = observable3.zipWith(zip, (str3, zipStr) -> { Log.e(TAG, "zip threadName=" + Thread.currentThread().getName()); return str3 + zipStr; } ); zip3.subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe((str) -> Log.e(TAG, "zip observable run time=" + (System.currentTimeMillis() - time)));

结论:
- 三个Observable执行在同一个线程
- 耗时大于 1800 +1500 + 1000
2.2 嵌套Zip部分设置执行线程
long time = System.currentTimeMillis();Observable<String> observable1 = getObservable(1800) .subscribeOn(Schedulers.io());Observable<String> observable2 = getObservable(1500) .subscribeOn(Schedulers.io());Observable<String> observable3 = getObservable(1000);Observable<String> zip = observable1.zipWith(observable2, new Func2<String, String, String>() { @Override public String call(String integer, String integer2) { String threadName = Thread.currentThread().getName(); Log.e(TAG, "zip threadName=" + threadName); return integer + integer2; }});Observable<String> zip3 = observable3.zipWith(zip, new Func2<String, String, String>() { @Override public String call(String s, String zips) { Log.e(TAG, "zip in zip threadName=" + Thread.currentThread().getName()); return s + zips; }});
Observable3没有设置执行线程,可以预见zip3只有两个执行线程。从log中也验证了这一猜想

2.3 调换zip和Observable3的位置。
Observable<String> zip3 = zip.zipWith(observable3, (str3, zipStr) -> { Log.e(TAG, "zip threadName=" + Thread.currentThread().getName()); return str3 + zipStr; } );

从2.2和2.3比较可以看出,不同的zipWith顺序,可导致不同的并行线程数。
2.4 都加上 subscribeOn(Schedulers.io())
Observable<String> observable1 = getObservable(1800) .subscribeOn(Schedulers.io()); Observable<String> observable2 = getObservable(1500) .subscribeOn(Schedulers.io()); Observable<String> observable3 = getObservable(1000) .subscribeOn(Schedulers.io());

从log看Observable执行在不同的线程。
结论:
- Observable执行在不同线程
- 执行时长 > 1800
3.0 map误区:
//测试得出结论,observeOn之前的执行现成在subscribeOn设置的线程中执行,observeOn之后的线程在observeOn设置的线程中执行。第一次设置subscribeOn、observeOn之后,在调用这两个方法,不在改变执行线程//每次操作符执行时,都会判断是否 UnSubscribe,若已执行,则终端后面的操作符mTestSubscribe = Observable.just("1")//io .map(createMap("just"))//io .subscribeOn(Schedulers.io())//io .map(createMap("subscribeOn after"))//io .subscribeOn(Schedulers.newThread())//io .map(createMap("new thread1111"))//io .observeOn(Schedulers.newThread())//此处不能用 MainThread, .map(createMap("observeOn after"))// .subscribeOn(Schedulers.newThread()) .map(createMap("new thread2222"))//mainThread //mainThread .flatMap(new Func1<String, Observable<String>>() { @Override public Observable<String> call(final String s) { return Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { Log.e(TAG, "call:start flatMap Threadname=" + Thread.currentThread().getId()); try { Thread.sleep(1500); } catch (InterruptedException e) { e.printStackTrace(); } subscriber.onNext("flatMap"); subscriber.onCompleted(); Log.e(TAG, "call:end flatMap Threadname=" + Thread.currentThread().getId()); } }); } }) //mainThread .subscribe(new Action1<String>() { @Override public void call(String s) { Log.e(TAG, "call:结束 Threadname=" + Thread.currentThread().getId() + " s=" + s); } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { throwable.printStackTrace(); } });
布局优化
布局优化减少ViewGroup的嵌套
优化前层级结构:共有7个层级

cach使用。
可对部分变化不大的接口是用cache
注意事项:
1、缓存会调用两次onNext回调
2、当缓存加载成功、接口加载失败是,需要处理onError回调,不在显示失败页面。
3、使用缓存后,第一次数据返回很快,loading可以适当延迟显示下。
0 0
- 业务首页优化记录
- 业务优化
- 业务优化
- 【记录】MyNM 首页
- 记录一个首页劫持
- 股票配资网站优化关键词排名到首页,记录,并跟进
- web首页加载优化
- Seo优化之首页优化
- 记录业务处理时间
- 业务报表速度优化
- ASP.NET 首页性能优化
- 淘宝首页性能优化实践
- 淘宝首页性能优化实践
- 淘宝首页性能优化实践
- 淘宝首页性能优化实践
- 性能优化--数据库优化--业务逻辑优化
- Android-内存优化-首页内存占用优化
- 浅析网站优化中的首页优化策略
- Python 学习之 GIL
- Linux--网络编程-常见服务器模型
- hdu1874 畅通工程续(Dijkstra/Floyd/Bellman-Ford/SPFA)
- 免费激活win10六个月
- Codeforces801A Vicious Keyboard
- 业务首页优化记录
- 字符串计数
- hdoj1286 欧拉函数模板
- UVA
- 装饰设计模式
- Digital Circuits (I) THE INVERTER
- 【CSS】CSS语言的使用方式和详细说明___完整教程(总结)
- Codeforces801B Valued Keys
- POJ2229 (递推)