自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(25)
  • 收藏
  • 关注

原创 如何设计一个优雅健壮的Android WebView?,吊打面试官系列

} if (mIWebViewClient != null) { mIWebViewClient.onPageFinished(view, newProgress); }}}可以看到,我们使用了`mProgressFinishThreshold`这个变量控制注入时机,这与前面提及的`当progress达到80的时候,加载出来的页面已经基本可用了`是相呼应的。> 达到80%很容易,达到100%却很难。正是因为这个原因,页面的进度加载到80%的时...

2021-09-08 21:32:20 355

原创 如何编写垃圾代码 - Android,面试篇

AlertDialog.Builder(context) .setView(0) .setTitle(R.string.dialog_title) .setMessage(R.string.dialog_message) .setIcon(0) .create() UI布局中的控件一定要密密麻麻???? UI布局中控件嵌套应越多越多,这样才能体现自己的逻辑思考能力⛲Good ???

2021-09-08 21:30:33 301

原创 如何构建Android MVVM 应用框架,高级Android开发必看

ViewModel层做的事情刚好和View层相反,ViewModel只做和业务逻辑和业务数据相关的事,不做任何和UI相关的事情,ViewModel 层不会持有任何控件的引用,更不会在ViewModel中通过UI控件的引用去做更新UI的事情。ViewModel就是专注于业务的逻辑处理,做的事情也都只是对数据的操作(这些数据绑定在相应的控件上会自动去更改UI)。同时DataBinding框架已经支持双向绑定,让我们可以通过双向绑定获取View层反馈给ViewModel层的数据,并对这些数据上进行操作。关于对UI

2021-09-08 21:28:45 362

原创 如何提高Flutter应用程序的性能,Android学习教程

class ConstDemo extends StatefulWidget {@override_ConstDemoState createState() => _ConstDemoState();}class _ConstDemoState extends State {@overrideWidget build(BuildContext context) {return Center( child: Column( children: [ Text('

2021-09-08 21:27:02 105

原创 如何才能通过一线互联网公司面试?请掌握这些,老师讲的真棒

.(package name)/ 目录下,所以我们需要做的是把已有的数据库传入那个目录下.操作方法是用FileInputStream读取原数据库,再用FileOutputStream把读取到的东西写入到那个目录.2.本地广播和全局广播有什么差别?因广播数据在本应用范围内传播,不用担心隐私数据泄露的问题。不用担心别的应用伪造广播,造成安全隐患。相比在系统内发送全局广播,它更高效。3.intentService作用是什么,AIDL解决了什么问题-小米生成一个默认的且与主线程互相独立的工作者线程来执

2021-09-08 21:25:19 60

原创 OO六大设计原则最全分析总结篇,使用指南

public class Client {public static void main(String[] args) { Driver zhangSan = new Driver(); Benz benz = new Benz(); //张三开奔驰 zhangSan.drive(benz);}}运行程序,我们创造的张三司机可以顺利的驾驶奔驰汽车了,如果现在张三司机不仅要开奔驰还要开宝马,怎么做呢,先生成宝马汽车:public class

2021-09-06 22:24:15 141

原创 OKio源码分析(1)six sy007 情感导师,Android开发必学

try { //超时检查 timeout.throwIfReached(); //从SegmentPool中获取Segment Segment tail = sink.writableSegment(1); //根据Segment中可用大小计算最大可以往Segment中写多少字节 int maxToCopy = (int) Math.min(byteCount, Segment.SIZE - tail.limit)...

2021-09-06 22:20:58 149

原创 OkHttp,蚂蚁金服Android架构面试题

} final String date = response.body().string(); mHandler.post(new Runnable() { @Override public void run() { mTvShow.setText(date); } });...

2021-09-06 22:19:11 245

原创 OkHttp踩坑记:为何 response,深夜思考

java.lang.IllegalStateException: closed 2.解决问题检查代码后,发现问题出在调用 parseResponseStr() 时,再次使用了 response.body().string() 作为参数。由于当时赶时间,上网查阅后发现 response.body().string() 只能调用一次,于是修改 onResponse() 方法中的逻辑后解决了问题:getHttpClient().newCall(request).enqueue(new Callback()

2021-09-06 22:17:23 1061

原创 Okhttp的缓存机制,四面阿里Android开发岗

//如果请求里有最大持续时间要求,则取较小的值作为上次响应的刷新时间 if (requestCaching.maxAgeSeconds() != -1) { freshMillis = Math.min(freshMillis, SECONDS.toMillis(requestCaching.maxAgeSeconds())); } //如果请求里有最短刷新时间要求,则用它来作为最短刷新时间 long minFreshMillis = 0; if (requestCach...

2021-09-06 22:15:40 173

原创 OkHttp3源码详解之Okhttp任务队列工作原理(三,已拿offer入职

1 概述1.1 引言android完成非阻塞式的异步请求的时候都是通过启动子线程的方式来解决,子线程执行完任务的之后通过handler的方式来和主线程来完成通信。无限制的创建线程,会给系统带来大量的开销。如果在高并发的任务下,启用个线程池,可以不断的复用里面不再使用和有效的管理线程的调度和数量的管理。就可以节省系统的成本,有效的提高执行效率。1.2 线程池ThreadPoolExecutorokhttp的线程池对象存在于Dispatcher类中。实例过程如下1. public synchron

2021-09-06 22:13:57 129

原创 GitHub标星4,Android架构师成长路线

或下载例子程序,在主项目app的build.gradle中依赖例子程序中的mvvmhabit:dependencies { ... implementation project(':mvvmhabit')} 1.3、配置config.gradle如果不是远程依赖,而是下载的例子程序,那么还需要将例子程序中的config.gradle放入你的主项目根目录中,然后在根目录build.gradle的第一行加入:apply from: "config.gradle"

2021-09-05 20:56:26 191

原创 MySQL人人都会用索引,原理你知道吗,面试总结+详细解答

其实,索引就是一种优化查询的数据结构,MySQL中的索引就是用B+树实现的。那么为什么MySQL会选择B+树作为索引的实现数据结构呢?它和哈希表、完全平衡二叉树、B树有什么不同?假设,我们现在有下面的user表:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iSEwfKU2-1630672244446)(//upload-images.jianshu.io/upload_images/12320828-4b074ea15427404c.png?imageMogr2/aut

2021-09-03 20:30:55 134

原创 LRUCache详解,高级安卓开发面试题

重置最大缓存值2)put方法 可以看到put()方法并没有什么难点,重要的就是在添加过缓存对象后,调用trimToSize()方法,来判断缓存是否已满,如果满了就要删除近期最少使用的算法。3) 获取缓存中的值LinkHashMap中的get方法 由此可见LruCache中维护了一个集合LinkedHashMap,该LinkedHashMap是以访问顺序排序的。当调用put()方法时,就会在结合中添加元素,并调用trimToSize()判断缓存是否已满,如果满了就用LinkedH..

2021-09-03 20:29:12 69

原创 LruCache 使用及原理,Android开发必须会的技能

return imageLoader.getBitmap("bitmap");}private void getBitmapFromInternet() { Log.e("chan", "===============getBitmapFromInternet"); OkHttpClient okHttpClient = new OkHttpClient(); Request request = new Request.Builder() .u...

2021-09-03 20:27:33 200

原创 LiveData概述,kotlin面试题

通常,LiveData仅在数据更改时才提供更新,并且仅在活动观察者时提供更新。此行为的一个例外是观察者在从非活动状态更改为活动状态时也会收到更新。此外,如果观察者第二次从非活动状态更改为活动状态,则只有在自上次活动状态以来该值发生更改时才会收到更新。以下示例代码说明了如何开始观察LiveData对象:public class NameActivity extends AppCompatActivity { private NameViewModel mModel; @Over

2021-09-03 20:25:43 167

原创 listview和scrollview嵌套使用--解决方案,金九银十旗开得胜

//重写onMeasure()的方法@Overridepublic void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);super.onMeasure(widthMeasu..

2021-09-03 20:24:02 220

原创 retrofit原理分析,就是这么简单

它最终返回一个0bservable对象,这个过程会组织网络请求、解析响应结果、将响应结果发送给订阅0bservable的0bserver这里我们需要拆成两步来看:loadServiceMethod()、invoke()分别做了什么。2、网络请求的准备阶段loadServiceMethod()完成的主要任务就是解析网络请求接口方法上的注解信息,得到数据适配器、数据解析器对象,最终封装一个CallAdapted继承了ServiceMethod的对象返回来,我们来一步一步看: 很显然,重点是parseA.

2021-09-02 20:20:11 207

原创 Retrofit2 源码解析,Android基础72问

1.2 Retrofit.Builderpublic static final class Builder { private final Platform platform; private @Nullable okhttp3.Call.Factory callFactory; private HttpUrl baseUrl; private final List<Converter.Factory> converterFactories = new

2021-09-02 20:18:22 87

原创 Retrofit-,BAT大厂面试题整理

// optional - GCMNetworkManager supportimplementation "androidx.work:work-gcm:2.3.4"// optional - Test helpersandroidTestImplementation "androidx.work:work-testing:2.3.4"implementation 'org.conscrypt:conscrypt-android:2.2.1'具体根据需求添加#### 2.2 请求辅助类

2021-09-02 20:16:40 442

原创 Retrofit+Rxjava网络层的优雅封装,Android开发教程入门

public class NetMgr {private final long connectTimeoutMills = 10 * 1000L;private final long readTimeoutMills = 10 * 1000L;private NetProvider sProvider = null;private static NetMgr instance;private Map<String, NetProvider> providerMap = new Hash

2021-09-02 20:15:09 89

原创 RecyclerView,看完豁然开朗

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jFa4qT39-1630584790427)(https://user-gold-cdn.xitu.io/2018/6/24/1642e5f8e2831083?imageslim)]这里我们滚动RecyclerView,使其可见范围为10到19,当我们分别滚动到1、3位置时,RecyclerView滚动了。且当前位置对应的视图在RecyclerView的顶部。二、RecyclerView smoothScrollToPosi

2021-09-02 20:13:21 126

原创 RecyclerView,Android自学资料

到了这里我们发现对于不同情况,RecyclerView内部处理是不一样的,所以为了解决实际问题,看源码是必不可少的,接下来我们就一起跟着源码走一遍。来看看RecyclerView具体的滚动实现。(这里需要提醒大家的是这里我采用的是LinearLayoutManager,本文章都是基于LinearLayoutManager进行分析的) public void smoothScrollToPosition(int position) { if (mLayoutFrozen) {

2021-09-02 20:11:37 145

原创 Android mvvm 之 LiveData 的原理,腾讯T3大牛手把手教你

以上,只为了说明一个问题:LiveData 需要订阅 LifecycleOwner,感知其生命周期变化:图示说明,LiveData 订阅 LifecycleOwner,而由 LifecycleOwner.Lifecycle 代理完成生命周期状态变化通知,所以 LiveData 直接能感知的是 Lifecycle。2.2 LifecycleOwner 订阅数据变化LifecycleOwner 在 STARTED 和 RESUMED 的状态下可以根据 LiveData 更新 UI 的状态,所以 Life

2021-09-01 11:41:58 322

原创 Android LayoutManager高端玩家,实现花式表格,最新整理

课程表表格TableView具有如下特点:支持不规则表格同时支持横向和纵向滚动支持顶部和左侧悬浮基于RecyclerView,所以RecyclerView自定义子视图、高效回收、子视图多样性这些特点它都有没有多层RecyclerView嵌套,性能更棒Github地址使用–第一步 | 添加xml文件<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="htt

2021-09-01 11:40:33 386

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除