我正在尝试使用WeakReference
类来防止Android中出现内存泄漏。
我设计了一个蓝牙API,允许两个Android设备使用Android蓝牙SDK进行通信(客户端和服务器)。
此API在共享库中可用(因此两个应用程序都可以访问相同的代码)。
这里的问题是我的弱引用中的引用会在几秒钟内被破坏。我尝试使用自定义ReferenceQueue
,但没有调用任何方法!
看看这两款Android设备的内存使用情况,我看不出任何可怕的内容:非常低,非常稳定,因为我只有一个具有少量观看次数的活动。
我认为WeakReference
应该保留我的活动的参考,只要他们不收集垃圾(意思是,没有强烈的参考)。我错了吗?
[编辑1]
为了提供更多说明,我将发布一些理论代码,代表我正在尝试做的事情。
Class 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!");
}
}
}
类活动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 。有什么理由证明这一点?
答案 0 :(得分:1)
WeakReference
中的{p> Android
不会等待下一个garbage collection
周期,并且在active and hard reference
没有抓住它们的那一刻就会自行销毁。
因此,您需要重构代码并避免将WeakReference
用作cache
。