首页 > 解决方案 > 接口对象在广播 onReceive 方法中具有空值

问题描述

我制作了一个接口来从广播接收器获取触发器,但它总是说接口对象具有空值!

这是定义接口的广播接收器类的代码:

public class GeofenceBroadcastReceiver extends BroadcastReceiver {

public interface ResultListener {
    public void SomeWorkToDo();
}

private ResultListener resultListener;

public void setter(ResultListener listener){
    Log.i("setter","working");
     this.resultListener=listener;
}

@Override
public void onReceive(Context context, Intent intent) {
    GeofencingEvent geofencingEvent = GeofencingEvent.fromIntent(intent);
    if (geofencingEvent.hasError()) {
        Toast.makeText(context, "error", Toast.LENGTH_SHORT).show();
        return;
    }

    int geofenceTransition = geofencingEvent.getGeofenceTransition();
    if (geofenceTransition == Geofence.GEOFENCE_TRANSITION_DWELL) {
        Log.i("Geo Fencing broadcast","Running");
        Toast.makeText(context, "You Are Arrived!!!", Toast.LENGTH_SHORT).show();
        resultListener.SomeWorkToDo();
    }else {
        Toast.makeText(context, "something went wrong", Toast.LENGTH_SHORT).show();
    }
}

这是清单文件的代码:

<receiver android:name=".GeoFencing.GeofenceBroadcastReceiver" />

这段代码在 MainActivity 中使用:

GeofenceBroadcastReceiver geofenceBroadcastReceiver=new GeofenceBroadcastReceiver();
    geofenceBroadcastReceiver.setter(new GeofenceBroadcastReceiver.ResultListener() {
        @Override
        public void SomeWorkToDo() {
            Log.i("our interface","working");
            startActivity(new Intent(ViewPlace.this,ViewDirections.class));
            finishAffinity();
        }
    });

标签: androidinterfacebroadcastreceiver

解决方案


您正在清单中注册接收器。你new GeofenceBroadcastReceiver()的不会被使用。Android 将创建自己的实例,说明GeofenceBroadcastReceiver何时接收到该接收器的广播。结果,回调将是null,因为您的 setter 没有被调用。

对于您要解决的任何问题,使用系统广播很可能是错误的解决方案。如果您确信系统广播是正确的答案,并且您希望保持接收器在清单中注册,则GeofenceBroadcastReceiver需要能够自己完成所有工作,而无需来自其他对象的任何类型的回调。


推荐阅读