网易 - 安卓班级问题汇总(更新)

34. 各位大佬开发h5native的混合APP时候,要先把数据存到h5localstorage,然后再刷新界面,各位大佬都是怎么做的。我每次都load2次url没办法控制进度条了

解答: Js调用,通过原生的JSInterface通知js代码刷新


33. 大家好资讯一个问题我tinker补丁下载成功以后为啥程序跑到这里就崩了,如果不下载补丁可以正常解析。

<com.baidu.mapapi.map.MapView
android:id="@+id/mmpa"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/rl"
android:layout_below="@id/title">
</com.baidu.mapapi.map.MapView>

解答:主要是混淆的原因。这是百度的自定义控件,安装apk后 可能是a.c.b.MapVIew这样就提示找不到,解决办法,尽可能定位到bug点,不替换activity类


32. 新安装的应用,系统是不是也会通过PMS扫描,把组件存档存到Packges缓存中去,什么流程?

解答:对的,流程和上课讲的一样


31. 之前我提的那个关于分包 , 配置指定类未能成功保留到主包classes.dex的那个问题~老师有没有什么问题排查的建议?

我拿老师的项目源码 加一个class, 可以正常保留到主包,而我自己却在自己的项目中,这样操作失败了,因为我的项目是公司实际的项目, 很多东西,其中肯定是某些东西给影响了,冲突了,导致失败, 但是不知道应该如何去排查,希望老师可以提一些排查的建议。

解答:第一步:先查看在gradlekeep方法是否执行了;第二步:反编译apk 查看最后添加的class在哪个dex


30. Glide缓存框架,设置的内存缓存maxsize为1g,我改成100m,测试发现退出MainActivity,内存并没有降下来,不知道什么情况

解答:

在最新的8.0 9.0 系统中 Google更改了gc回收机制。
调用System.gc() GC并不会立马被执行,解决办法,给apk设定限制内存 如125M
或者开启其他apk情况下,测试。 加大gc回收概率


29. 老师,知道微信公众号推送消息48小时限制怎么解决?

解答:没办法解决


28. vivo手机悬浮窗权限判断问题,vivo的悬浮窗权限用系统api去检查的时候,是有权限的,但是实际去显示悬浮窗的时候,他的悬浮窗权限会被vivo的i管家拦截。

解答:没办法解决,悬浮框是比较重要的系统权限,一般有厂家改写了


27. 进程没活下来,是咋回事

解答:保活有很多限制,目前只能做到尽可能保活。

如9.0版本直接放弃吧。目前最好的方式是白名单机制和谷歌账号保活


26. 老师在IoC的RecyclerView条目点击那节课,为什么下面这种就报错了呢?

@OnClick(R.id.btn)
public void click(View btn) { // 正确,没问题
Toast.makeText(this, "btn click", Toast.LENGTH_SHORT).show();
}

@OnClick(R.id.tv)
public void click() { // 点击方法无参数,异常
Toast.makeText(this, "tv click", Toast.LENGTH_SHORT).show();
}

解答:

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (target != null) {
// 获取需要拦截的方法名
String methodName = method.getName(); // 假如是onClick
// 重新赋值,将拦截的方法换为click
method = methodHashMap.get(methodName); // 执行拦截的方法,click
if (method != null) {
// 获取方法参数
Type[] parameterTypes = method.getGenericParameterTypes();
if (parameterTypes.length == 0) { // 加入方法参数判断
return method.invoke(target);
} else {
return method.invoke(target, args);
}
}
}
return null;
}

25. 群里有没有大神遇到过这个问题并解决的,配置了ndk环境之后创建项目会报这个错误

CMake Error: CMake was unable to find a build program corresponding to "Ninja". CMAKE_MAKE_PROGRAMis not set. You probably need to select a different build tool.

解答:


24. 《动态加载第三方应用 - 插件化架构详解》学了这节公开课有个疑问。如果有个业务app里面有application,主app里面需要做额外的处理不?是把application里面需要初始化的方法放在业务app某个activity里面执行吗?

解答:

1、需要将业务appapplication配置到appconfig中。
2、主app中初始化时,通过反射调用业务appinit方法,将自己的上下文传入


23. 《Android人工智能离你并不遥远,OpenCV实现人脸识别》课程下的代码导入studio中报这个错,导入项目运行最后提示c++_static代替gnustl_static,只改了下这里。 AS版本是最新的,还需要其他配置吗?

解答:使用:gnustl_staticopenCV是使用这一个函数模板库编译的


22. emoji表情在android iosweb使用的方案

解答:参考:https://www.jianshu.com/p/d82ac2edc7e8


21. 发现Bugly没有内测分发项,该怎么上传基线版本?或者有没有其他的平台推荐?

解答:推荐:友盟(Umeng)


20. Tinker热修复是不是不支持9.0呀,还是需要什么特殊配置?

解答:支持9.0设备,插桩的方式虽然用到了反射技术,但不被黑名单列入


19. 老师请问一下,Annotation注解的生命周期我自己定义的时候怎么选择?

解答:

/**
* 生命周期:SOURCE < CLASS < RUNTIME
* 1、一般如果需要在运行时去动态获取注解信息,用RUNTIME注解
* 2、要在编译时进行一些预处理操作,如ButterKnife,用CLASS注解。注解会在class文件中存在,但是在运行时会被丢弃
* 3、做一些检查性的操作,如@Override,用SOURCE源码注解。注解仅存在源码级别,在编译的时候丢弃该注解
*/

SOURCE源码级绝大部分场景用不上一般是谷歌源码。CLASS用于编译期处理好比ButterKnife框架,RUNTIME指的是运行时通过反射技术。视真实场景再定义


18. 如果讲述安卓源码的时候,希望尽可能选用最新android API版本来讲

解答:彭老师的移动架构师专题,讲解的是9.0源码哦


17. 能不能教一下调试jni的方法?

解答:
单纯C/C++调试可以尝试Visio Studio IDE(老鸟)
新人建议:LLDB插件工具


16. 老师,安卓在线源码地址多少?

解答:点开左边“友链”,有放在里面


15. 上次讲事件分发的那个老师,在讲解ViewGroupdispatchTouchEvent时,有一个问题让我很困惑,就是利用mChildrenCount遍历View层级进行事件分发时,我的理解是mChildrenCount标识的是当前ViewGroup所包含的子View的个数,不知道是否正确?

解答:是的


14. coordinatorlayout可以把viewgroup作为child吗?我这边把ConstraintLayout作为behaviorchild,这个behavior没有跟着coordinatorlayout动起来,我想要动起来。我的xml里没有引用到behavior

解答:可以,这些技术点会在正式课程高级UI详细讲解


13. 有人做过通过蓝牙麦克风录音的吗?通过AudioRecord来录音。有没有什么推荐的文章之类的?

解答:参考文章:https://blog.csdn.net/linzekai100/article/details/79487903


12. android编译后报这个错误:

com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 1 字节UTF-8 序列的字节 1 无效

有人遇到过吗?

解答:将xml文件单独处理为UTF-8格式,再导入项目中重新编译


11. 蓝牙耳机的SCO通道采集录音,在通过蓝牙耳机输出,声音太小,同学们有遇到过这样的问题吗?

解答:暂未涉及这类项目
不过可以参考这篇文章:https://blog.csdn.net/cai784921129/article/details/53024091


10. sqlite删除的数据可以找的回来不?

解答:不可以


9. 有人搞过蓝牙开发吗?对device里面的major类有什么看法没?

解答:主要设备类段是定义蓝牙设备的最高粒度级别。设备的主要功能决定了其主要类分组。此主要类字段的分配在表中进行了定义。

public static final int AUDIO_VIDEO 音频/视频(耳机、扬声器、视频显示/VCR...)
Constant Value: 1024 (0x00000400)
public static final int COMPUTER 计算机(台式机、笔记本...)
Constant Value: 256 (0x00000100)
public static final int HEALTH 健康
Constant Value: 2304 (0x00000900)
public static final int IMAGING 成像(打印、扫描仪、相机、显示...)
Constant Value: 1536 (0x00000600)
public static final int MISC 其他
Constant Value: 0 (0x00000000)
public static final int NETWORKING LAN/网络接入点
Constant Value: 768 (0x00000300)
public static final int PERIPHERAL 配件(鼠标、游戏杆、键盘...)即外设
Constant Value: 1280 (0x00000500)
public static final int PHONE 电话(手机、支付电话、调制解调器...)
Constant Value: 512 (0x00000200)
public static final int TOY 玩具
Constant Value: 2048 (0x00000800)
public static final int UNCATEGORIZED 未分类:未指定设备代码
Constant Value: 7936 (0x00001f00)
public static final int WEARABLE 可穿戴
Constant Value: 1792 (0x00000700)

8. 这种导航定位怎样才能定位到准确的位置啊?

(淘宝APP商品详情页,点击评论/详情/推荐,会定位到具体的区域)

解答:可以通过getTop()获取到控件相对父容器的位置,然后调用ScrollViewscrollTo()方法可以滚动到指定View的顶部


7. 两边文字对比,有不一样的地方就变红,有什么思路吗?

解答:可以将两段文字进行对比,获取到不同的文字的或不同文字的下标,然后通过

String s = HTML.fromHtml("<font color=\"#ff0000\">1</font>2");
// 或者
SpannableStringBuilder ssb = new SpannableStringBuilder(sm);
ssb.setSpan(new ForegroundColorSpan(Color.RED), 4, 10, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);

的方式修改相应文字的颜色,再调用TextViewsetText()方法将修改后的文本设置就可以了


6. 彭老师,对象锁为啥用长度为零的对象数组?而不用对象?性能上有啥区别么?

解答:零长度的byte数组对象创建起来将比任何对象都经济。
查看编译后的字节码:生成零长度的byte[]对象只需3条操作码,而Object lock = new Object()则需要7行操作码


5. 用三方SDK来做IM通讯聊天和短视频播放,用哪个三方比较好,都有什么优势呢?

解答:通讯聊天这块最好是根据自己公司的业务,需求,然后去搜索多个第三方的官方,找他们的技术顾问进行询问,IM这块老师之前用过环信。


4. 项目中没有做过HTTPS和数据加密这块,网上有看过大概说的什么流程,但是感觉不是可信,比如说电商项目中,怎么去做订单交易这块数据加密,实现HTTPS一个的流程是怎么样,如果可以的希望能够更贴近业务案例来说明下。备注:老师手上如果有现成的资料的话,可以直接分享资料给同学。

解答:关于https需要自行翻阅资料,该协议包含的内容非常多。
另外电商项目中的数据加密,只要有普通的加密即可,比如base64,这样只要能保证客户端与服务器端在进行数据交互时不裸奔即可。但需要注意的是,客户端如果有比较私密的信息最好用非对称加密比如rsa,只加密关键数据。另外,客户端需要进行apk加固,让破解的人更难获得客户端源码。这一块是客户端需要进行的加密。
需要注意的是,如果订单数据在客户端进行了加密,还需要服务器端同步进行加密,比如你的客户端发送的数据为orderid=1&amount=100&userid=1 那么你需要将这些数据进行对称加密,比如md5,生成一个唯一码,让服务器端同样对数据进行加密比对,确保该数据没有被篡改,简而言之,服务器端在对客户端进行数据校验时,要以服务器端的数据为主,确保客户端过去的数据与服务器一致。


3. 序列化的错误,怎么有遇到过吗?

java.lang.RuntimeException: Parcel android.os.Parcel@1e48b6d7: Unmarshalling unknown type code 3276854 at offset 540

解答:序列化时数据读写顺序要一致,writeToParcel里写的顺序要和CREATOR里读的顺序一致。


2. 怎样在一个方法里返回一个网络请求返回的结果啊?

解答:网络请求返回结果是异步操作,可以通过回调方法返回结果


1. jsbridge 有没有推荐的文章,比较高级一点的

解答:https://blog.csdn.net/zuggs_/article/details/80649669
高级点的就是深挖原理了,同学可以自行查找类似文章即可