public class OuterClass extends Something{
private int unit = 0;
private void methodX(int num){
//Do something here
}
public static class InnerClass extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Need to call methodX(100) here
}
}
}
我正在装箱申请,工作正常。但是当我使用时
static OuterClass instance;
在OuterClass中并通过
访问其变量instance.methodX(100)
从内部类导致内存泄漏。如果我从内部类中删除静态关键字广播接收器未触发。
这是我的清单文件的一部分。
<receiver
android:name=".OuterClass$InnerClass"
android:enabled="true"
android:exported="true">
<intent-filter >
<action android:name="com.xyz.abc.RESULT"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</receiver>
这正如我预期的那样工作,但它有一些内存泄漏。我需要从静态内部类访问外部类方法而没有内存泄漏。因为我应该避免使用外部类的静态实例。
如果有人能帮我找到从内部类访问outerClass methodX的方法,我真的很感激。
答案 0 :(得分:0)
声明一个静态内部类与创建一个新文件类似,条件是你需要一个外部类的实例才能工作。
非静态内部类的工作方式与非静态字段类似:它们是特定于实例的。这意味着您需要一个outter对象的实例来初始化一个新的内部对象。
当它是静态的时,你不需要outter类的对象来工作。
对于非静态内部类,您可以这样做:
outter.new Inner()
并访问它嵌套的类。
但是由于你的类是静态的,你必须像普通的那样传递一个实例。即
new Outter.Inner(outterInstance)
但是:由于该类扩展了BroadcastReceiver,因此它会初始化为空构造函数。这意味着永远不会使用带有值的构造函数,因为BroadcastReceiver是一个系统初始化和处理的系统。相反,在空构造函数中创建一个新实例,或将所有变量移动到当前内部类
中由于BroadcastReceiver需要一个空的构造函数,所以不可能这样做:
public Inner(Outter instance)
它不会被初始化,你也可能从中得到例外。但是,你可以这样做:
public Inner(){
outter = new Outter();
}
或者,将所有outter类字段和方法移动到BroadcastReceiver中。
答案 1 :(得分:0)
您可以将该方法methodX()
标记为static
。在此之后,您将能够在static
内部类中访问该方法。