接口对象在Broadcast onReceive方法中为空值

问题描述 投票:0回答:1

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

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

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();
        }
    });
android interface broadcastreceiver
1个回答
0
投票

您正在清单中注册接收者。您的new GeofenceBroadcastReceiver()将不被使用。接收到该接收器的广播时,Android将创建其自己的GeofenceBroadcastReceiver实例。结果,回调将为null,因为未调用您的setter。

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

© www.soinside.com 2019 - 2024. All rights reserved.