MyActivity从MyClass.java实现Custom Listener,但Listener始终为NULL

时间:2012-04-03 13:28:41

标签: android

MyActivity实现MyClass.java中定义的CustomListener。我在MyClass中定义了一个函数,它应该触发监听器并执行一些在活动中定义的动作(finish()MyActivity)。不知何故,我得到了对侦听器的null引用。我哪里错了?

请参考下面的代码!

MyActivity.java

import com.project.MyClass.CustomListener;

public class MyActivity extends Activity implements CustomListener {

    Context context;
    CustomListener listener;

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        context = this;

        myClass = new MyClass(context);
        myClass.setOnCustomListener(listener);

    }

    public void doThisWhenTriggered()
    {
    ...
    }

}

MyClass.java

public class MyClass{

    private Contect ctx;
    ArrayList<CustomListener> listeners = new ArrayList<CustomListener>();

    public MyClass(Context context)
    {
        super();
        this.ctx = context
    }

public interface CustomListener
{
       public void doThisWhenTriggered();
}


public void setOnCustomListener(CustomListenerListener listener)
{
    this.listeners.add(listener);
}

    public void generateTrigger()
    {
        CustomListener listener = listeners.get(0);

        if(listener != null)
            listener.doThisWhenTriggered();
        else
            Log.d("MyAPP", "Listener is NULL");
    }

}

MyBroadcastReceiver.java

public void onReceive(Context context, Intent intent) {
    ...
    callMyClass(Context context)
}

public void callMyClass(Context context)
{
    MyClass myClass= new myClass(context);
    myClass.generateTrigger(context);
}

修改

问题是因为@Binyamin Sharet正确指出了在BroadcastReceiver和Listeners列表中访问MyClass的不同实例

解决方案是将侦听器列表声明为static,并将public void generateTrigger()声明为static,以便接收器的callMyClass看起来像:

public void callMyClass(Context context)
{
    MyClass.generateTrigger(context);
}

2 个答案:

答案 0 :(得分:1)

您永远不会实例化listener(声明为CustomListener listener;),因此它始终为null,您只需将活动设置为侦听器,因为它实现了接口:

myClass.setOnCustomListener(this);

如您的代码所示,您在接收器中创建了该类的新实例,因此您设置的侦听器不存在于新实例的侦听器列表中,因为该列表不是静态的。

答案 1 :(得分:0)

因为

 MyClass myClass = new myClass(context);
MyBroadcastReceiver.java中的

。这将创建一个新实例。

所以我认为将MyClass.java用作Singleton会更好。

public class MyClass {

    private Contect ctx;
    ArrayList<CustomListener> listeners = new ArrayList<CustomListener>();
    private static final MyClass singletonMyClass = new MyClass();

    private MyClass() {
    }

    public static CustomListner getInstance() {
        return singletonMyClass;
    }

    public interface CustomListener {
        public void doThisWhenTriggered();
    }

    public void setOnCustomListener(CustomListenerListener listener) {
        this.listeners.add(listener);
    }

    public void generateTrigger() {
        CustomListener listener = listeners.get(0);

        if (listener != null)
            listener.doThisWhenTriggered();
        else
            Log.d("MyAPP", "Listener is NULL");
    }

}
来自MyActivity.java

,您可以致电

MyClass myClass = MyClass.getInstance();
myClass.setOnCustomListener(listener);

,类似于MyBroadcastReceiver.java

public void callMyClass(Context context)
{

    MyClass myClass= MyClass.getInstance();
    myClass.generateTrigger();

}

希望这会有所帮助!!!