WeakReference:引用在"秒内销毁#34;

时间:2017-02-08 08:20:05

标签: java android memory-leaks weak-references

我正在尝试使用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 。有什么理由证明这一点?

1 个答案:

答案 0 :(得分:1)

WeakReference中的{p> Android不会等待下一个garbage collection周期,并且在active and hard reference没有抓住它们的那一刻就会自行销毁。

因此,您需要重构代码并避免将WeakReference用作cache