从Service发送数据到Activity时出错

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

我正在尝试将数据从服务发送到活动, 这是我当前的代码:

interface sListener {
    void OnNotify      (String data);
}

public class MainActivity extends AppCompatActivity implements ServiceConnection, sListener {
    sService service;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        bindService(new Intent(this, sService.class), this, Context.BIND_AUTO_CREATE);

    @Override
    public void onResume(){
        super.onResume();

    }
    @Override
    public void onStop() {
        if(service != null && !isChangingConfigurations())
            service.detach();
        super.onStop();
    }
    
    public void OnNotify(String data){
        //... get data from Service
    }
    
    @Override
    public void onServiceConnected(ComponentName name, IBinder binder) {
        System.out.println("onServiceConnected");
        service = ((sService.sBinder) binder).getService();
        service.attach(this);
        startService(new Intent(this, sService.class));
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        service = null;
    }
    
}




public class sService extends Service {
    sReceiver receiver = new sReceiver();
    private final IBinder binder;
    
    public sService(){
        binder = new sBinder();
    }
    
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        return binder;
    }
    
    class sBinder extends Binder {
        sService getService() { return sService.this; }
    }
    
    public void attach(sListener listener) {
        Log.d("sService","attach()");
        if(Looper.getMainLooper().getThread() != Thread.currentThread())
            throw new IllegalArgumentException("not in main thread");

        synchronized (this) {
            receiver.setListener(listener);
            //this.listener = listener;
        }


    }
    
    public void detach() {
    }
    
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        registerReceiver(receiver, new IntentFilter("android.intent.action.BATTERY_LOW"));

        return START_STICKY;
    }
    
    static public class sReceiver extends BroadcastReceiver implements sListener {
        sListener listener;
        
        public void setListener(sListener listener){
            this.listener = listener;
        }
        
        public void OnNotify(String data){
            listener.OnNotify(data); //send data to Activity
        }
        
        
    }
}

调用

OnNotify
时出现以下错误:

java.lang.RuntimeException:无法启动接收器 com.example.sService$sReceiver: java.lang.NullPointerException: 尝试调用接口方法“void” com.example.sListener.OnNotify(java.lang.String)' 在空对象上 参考

为什么我收到此错误?

谢谢。

java android service
1个回答
0
投票
listener.OnNotify(data); //send data to Activity

尝试呼叫

listener
之前,请检查
null
是否为
OnNotify()
。或者,在
registerReceiver()
中设置侦听器之前,不要调用
attach()
。我的猜测是,您在调用
attach()
之前收到了广播。

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