MyActivity从MyClass.java实现自定义监听器监听,但始终是NULL [英] MyActivity implements Custom Listener from MyClass.java but Listener is always NULL
问题描述
MyActivity实现在MyClass.java限定的CustomListener。我在活动中定义MyClass中定义的函数应触发监听器和做一些动作(完成()MyActivity)。不知怎的,我得到空引用到侦听器。我在哪里去了?
请参阅下面的code!
MyActivity.java
进口com.project.MyClass.CustomListener;公共类MyActivity扩展活动实现CustomListener { 上下文语境;
CustomListener监听; 公共无效的onCreate(捆绑savedInstanceState){ super.onCreate(savedInstanceState);
上下文=这一点; MyClass的=新MyClass的(上下文);
myClass.setOnCustomListener(监听); } 公共无效doThisWhenTriggered()
{
...
}}
MyClass.java
公共类MyClass的{ 私人客户服务联系CTX;
ArrayList的< CustomListener>听众=新的ArrayList< CustomListener>(); 公共MyClass的(上下文的背景下)
{
超();
this.ctx =上下文
}公共接口CustomListener
{
公共无效doThisWhenTriggered();
}
公共无效setOnCustomListener(CustomListenerListener监听器)
{
this.listeners.add(监听);
} 公共无效generateTrigger()
{
CustomListener听者= listeners.get(0); 如果(听众!= NULL)
listener.doThisWhenTriggered();
其他
Log.d(MYAPP,监听器是空);
}}
MyBroadcastReceiver.java
公共无效的onReceive(上下文的背景下,意图意图){
...
callMyClass(上下文的背景下)
}公共无效callMyClass(上下文的背景下)
{
MyClass的MyClass的=新MyClass的(上下文);
myClass.generateTrigger(上下文);
}
修改
问题是因为在广播接收器和监听器列表访问MyClass的不同实例作为正确地指出的@Binyamin Sharet
的解决方案是声明侦听器列表为静态并且还公共无效generateTrigger()为静态,以使接收机的callMyClass看起来像:
公共无效callMyClass(上下文的背景下)
{
MyClass.generateTrigger(上下文);
}
您从来没有实例监听器
(声明为 CustomListener监听;
),因此它总是空,你只需要设置活动为监听器,因为它实现了接口:
myClass.setOnCustomListener(本);
由于在code看到的,你创建的接收器类的新实例,让你设置新实例的监听器列表不存在,因为列表不是静态的监听器。
MyActivity implements a CustomListener defined in MyClass.java. I have a function defined in MyClass that should trigger the listener and do some action(finish() MyActivity) defined in the activity. Somehow, I am getting null reference to the listener. Where am I going wrong?
Please refer to the code below!
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);
}
EDIT
The problem was BECAUSE of accessing different instances of MyClass in BroadcastReceiver and Listeners list as correctly pointed out by @Binyamin Sharet
The solution is to declare the listener list as static and also public void generateTrigger() as static so that the receiver's callMyClass looks like :
public void callMyClass(Context context)
{
MyClass.generateTrigger(context);
}
You never instantiate listener
(declared as CustomListener listener;
) and therefore its always null, you just need to set the activity as the listener, as it implements the interface:
myClass.setOnCustomListener(this);
As seen in your code, you create a new instance of the class in the receiver, so the listener you set does not exist in the listeners list of new instance, since the list is not static.
这篇关于MyActivity从MyClass.java实现自定义监听器监听,但始终是NULL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!