1

我很好奇 Java 环境中的软引用和弱引用。我还阅读了一些关于这两个主题的内容。总结一下,弱引用顾名思义就是对对象的弱引用。这意味着对这个对象的引用很容易被GC. 弱引用是这样创建的:

WeakReference<SomeOtherRef> weakReference = new WeakReference(someOtherRef); 

另一方面,软引用将比弱引用保留更长的时间。所以我的问题是:

在我的应用程序中,我有一个用于ListView此类的自定义适配器,它将处理所有基本ListView内容,如处理点击等。当用户单击列表中的项目时,将启动 AsyncTask。

convertView.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {

                LoadCase loadCase = new LoadCase(position, holder);
                loadCase.execute("");

            }
        });

目前我没有显示任何进度对话框,原因之一。context对象。我的问题是,Activity它将初始化 CustomAdapter 包含许多对象,并且我必须传递对 的引用Activity Context才能显示 a ProgressDialog,这导致内存泄漏,是的,我已经尝试过了。应用弱/软参考来处理这个问题是否安全?AWeakReference在某些时候可能是 null..NullPointerException当我尝试初始化我的ProgressDialog.

4

1 回答 1

1

是的,在这里使用 a 是个好主意WeakReference,因为活动可能会被破坏。每次要使用它时都必须检查它是否为 null 以避免NullPointerException. 如果它为 null,则意味着该活动已被销毁,因此显示ProgressDialog.

当然,活动可能会被销毁并重新创建(例如,由于方向更改)。如果AsyncTask需要很长时间,则可能会出现不再显示进度条的问题。但是这里的问题是使用AsyncTask一个长任务,它们是为短任务而设计的。

另外,请记住,如果您将子类AsyncTask化为类中的内部类Activity,它将对 Activity 具有强引用,因此使用 aWeakReference将毫无用处。

于 2012-12-10T08:51:26.040 回答