gpt4 book ai didi

java - 弱引用 : reference is destroyed within "seconds"

转载 作者:行者123 更新时间:2023-11-30 10:33:38 25 4
gpt4 key购买 nike

我正在尝试使用 WeakReference 类来防止 Android 中出现内存泄漏。

我设计了一个蓝牙 API,它允许两个 Android 设备(一个客户端和一个服务器)使用 Android 蓝牙 SDK 进行通信。

此 API 在共享库中可用(因此两个应用程序都可以访问相同的代码)。

这里的问题是我的弱引用中的引用在几秒钟内就被破坏了。我尝试使用自定义 ReferenceQueue 但没有调用它的任何方法!

查看这两款 Android 设备的 RAM 使用情况,我没有发现任何可怕的东西:非常低,非常稳定,因为我只有一个 Activity 和几个 View 。

我认为 WeakReference 应该保留对我的 Activity 的引用,只要它们不被垃圾收集(意思是,不再有强引用)。我错了吗?


[编辑 1]

为了提供更多说明,我将发布一些理论代码,这些代码应该代表我正在尝试做的事情。

BluetoothAPI 类

 private WeakReference<BluetoothStateListener> stateListener;

public final void setProgressListener(@Nullable BluetoothProgressListener progressListener) {

this.progressListener = new WeakReference<>(progressListener, new Ref<>(context));
}

private synchronized void notifyProgress(final float percent) {
if (this.progressListener != null) {
final BluetoothProgressListener listener = this.progressListener.get();
if (listener != null) {
UIAccess.runOnUiThread(new Runnable() {
public final void run() {
listener.onProgress(percent);
}
});
} else {
Log.d(TAG, "Progress Listener is null!");
}
}
}

类 Activity A,在 onCreate()

 this.btAPI.setProgressListener(new BluetoothProgressListener() {
@UiThread
public final void onProgress(final float percent) {
final int progress = Math.round(percent * 10);
progressBar.setProgress(progress);
progressLabel.setText(getString(R.string.main_act_progress_status_tv_incoming, progress / 10));
}
});

接收数据时,我的进度条永远不会更新,因为 BluetoothProgressListener 始终为 null。什么证明了这一点?

最佳答案

WeakReferenceAndroid不等待下一个garbage collection循环并在没有 active and hard reference 的那一刻 self 毁灭捕获了他们。

所以你需要重构你的代码并避免使用WeakReference作为cache .

关于java - 弱引用 : reference is destroyed within "seconds",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42107951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com