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);
}
答案 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();
}
希望这会有所帮助!!!