首页   注册   登录
 shily 最近的时间轴更新
shily

shily

V2EX 第 92627 号会员,加入于 2015-01-19 17:10:48 +08:00
shily 最近回复了
12 天前
回复了 matepi 创建的主题 Java Java 的有个异常设计一直没理解
@iFlicker
@lff0305 # 6 的才是正确答案。

『都会被升格成为 ExceptionInitializerError。从而不能被 catch Exception 所 catch 』这个说法本身是错误的。
呃,怎么说呢,它并不是被升格,而是因为你不处理,导致 JVM 无法进行下去,JVM 崩溃了,为了进一步表示 JVM 为什么崩溃而包装了一下。

ExceptionInitializerError 表示类初始化的时候发生了异常,可以通过 getCause() 获知错误的具体原因。

呐如果我想自己处理 NumberFormatException 改怎么写呢?

static int i = Integer.parseInt("e"); // 无法直接使用 try-catch

但是它等价于

static int i;
static {
i = Integer.parseInt("e");
}


这样你就可以自行处理其中抛出的异常了。
static int i;
static {
try {
i = Integer.parseInt("e");
} catch (NumberFormatException nfe) {
// handle exception here
}
}
学习了。

类型擦除后,itest 就没有类型了,变成了

public interface itest {
Object test(Object o);
}

为了让 test 实现 itest 接口,编译器帮忙实现了一个接口
public Object test(Object o) {
String s = (String) o;
return test(s);
}

这样就多了一个方法。

如果使用 itest<String> t = new test() 然后调用 String v = t.test("123")
就会变成 String v = (String) t.test("123") ; // 就是调用 Object test(Object)
如果使用 test t = new test() 然后调用 String v = t.test("123")
就会变成 String v = t.test("123") ; // 就是调用 String test(String)
申请 WiFi 锁
其实这个自动播放不是视频播放器控制的,它是广告 SDK 控制的,估计是产品合入广告时没有设置自动播放为关。

难受,国内站在挣钱太难了。
49 天前
回复了 hanliu 创建的主题 MacBook Pro MBP 2018 最多只能连接 2 个蓝牙设备
正常,我的也是,就这两个连的还经常断开。现在切换到有线了,但同样位置的 Windows NUC 配同样的设备,啥事没有。
58 天前
回复了 raiz 创建的主题 Android AS 3.5 : project needs to be converted to androidx
难道我用的假的 AS ? 没有强制要求啊。
强制要求是因为你依赖的库使用了 AndroidX 了吧。
在网页聊天,按照要求传真信用卡正反面+最新一期的账单
70 天前
回复了 m30102 创建的主题 Android 关于 gc 和非静态内部类引起内存泄漏的疑问
@pdog18
第一个,是没有问题的,Runnable 是 OnClickListener 的内部类,所以引用关系是 $Runnable -> $OnClickListener-> Activity,检查一下生成的类可以看到引用的是 TActivity$1 即 匿名的 OnClickListener 类。

确实如你所说,分析内存泄漏时,一般优先分析最短路径,textView 的内部通过 mContext 已经引用了 Activity。
此非最短路径,分析和解决问题时均需要考虑到,为了释放 activity 引用,这两个引用链均需要在合适的时机置空。(其实是在所有的情况下都不应该把 View 放置在全局引用)
71 天前
回复了 m30102 创建的主题 Android 关于 gc 和非静态内部类引起内存泄漏的疑问
1. 如#2 所说 『生命周期长的对象引用生命周期短的对象就会造成生命周期短的对象内存泄漏。』
如果 Thread 不需要 Activity,但因为 Runnalbe 是一个非静态内部类,会默认持有外部类的引用;非主观期望,就是泄露。
如果 Thread 需要 Activity,我就是启动一个空的 Activity,来执行,也不占用大量的资源,主观期望,就不是泄露了。

2. 循环依赖(持有环:TActivity->textView->$OnClickListener->TActivity ),GC 是能发现和处理循环依赖,依然可以进行回收;
如果你把 textView 对象传递给外部的对象,比如一个单例对象持有,就会导致整个环均无法被回收。

3. 没有点击的情况下,Thread 对象和 匿名的 Runnable 对象均未创建,当然没有泄露。
在此场景下,假设点击行为发生,持有链为 $Runnable -> $OnClickListener-> Activity。

需要注意:
类与对象的关系,针对第三种场景,就是类有依赖,但对象未创建。
我们讨论内存泄露时,考虑的是对象间的引用关系,对象间的引用关系是由类来表达的。


关于 #3
不是栈,是引用链,方法栈会导致引用关系,但不是一一对应。

方法完成后,Runnble 对象已经没有其他对象引用了,可以被回收,进而它所引用的 activity 等资源也可以被回收。

已经泄露的对象,可以通过切断持有关系来让 GC 回收。以 OnClickListener 为例,如果我在 onCreate 中把 textView 放到一个单例的对象中持有,那么这个 TActivity 就会有一条引用关系 Root-> Singleton->textView->$OnClickListener->activity,导致 TActivity 泄露。

如果是:
public final class Singleton {
private Singleton() {

}

public static final Singleton INSTANCE = new Singleton();

public View holder;
}

那么,下一次再次进入 TActivity 时,新的 textView 对象被赋予 holder 时,原持有的 textView 和 原 TActivity 可以被回收。
关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2376 人在线   最高记录 5168   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.3 · 19ms · UTC 14:06 · PVG 22:06 · LAX 06:06 · JFK 09:06
♥ Do have faith in what you're doing.