如何从Java

时间:2017-12-11 10:31:00

标签: java android memory-leaks static inner-classes

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的方法,我真的很感激。

2 个答案:

答案 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中。

You should read this SO post on the topic

答案 1 :(得分:0)

您可以将该方法methodX()标记为static。在此之后,您将能够在static内部类中访问该方法。