【问题标题】:Callback Listener always returning null回调监听器总是返回 null
【发布时间】:2017-06-11 21:17:51
【问题描述】:

我正在尝试为 Android 创建一个简单的 SMS 库,为此我创建了一些自定义侦听器。我想在事件发生时触发该侦听器,例如。 SMS 已发送或失败。我能够发送和接收 SMS,但未调用侦听器事件,因为我的侦听器始终返回 Null。谁能告诉我我哪里做错了?

public class SendSMS {

    private  OnSMSListener listener;

    public void OnSMSListener(OnSMSListener listener) {
        this.listener = listener;
    }

    public SendSMS(Context context) {
        Holder.setContext(context);
        this.listener = null;

    }


    public void setNumber(String number)  {
        Holder.setMobNumber(number);

    }

    public void setMessage(String message) {
        Holder.setMessage(message);
    }

    public void sendMessage() {
        ImplSendSms.sendTextMessage(listener);
    }

    /**
     * Interface definition for a callback to be invoked
     */
    public interface OnSMSListener {

        void onSmsSent();

        void onGenericFailure();

        void onNoService();

        void onNullPdu();

        void onRadioOff();
    }

MyImplSendSms.class 文件:

public class ImplSendSms {

    public  static void sendTextMessage(final SendSMS.OnSMSListener listener) {

        Toast.makeText(Holder.getContext(), "sendTextMessage", Toast.LENGTH_SHORT).show();

        String SENT = "SMS_SENT";
        PendingIntent sentPI = PendingIntent.getBroadcast(Holder.getContext(), 0,
                new Intent(SENT), 0);

//---when the SMS has been sent---
        Holder.getContext().registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context arg0, Intent arg1) {
                switch (getResultCode()) {
                    case Activity.RESULT_OK:
                        Toast.makeText(Holder.getContext(), "Inside Sent", Toast.LENGTH_SHORT).show();
                        if (listener != null) {
                            Toast.makeText(Holder.getContext(), "Inside Sent Listener", Toast.LENGTH_SHORT).show();
                            listener.onSmsSent();
                        }

                        break;
                    case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                        if (listener != null) {
                            listener.onGenericFailure();
                        }

                        break;
                    case SmsManager.RESULT_ERROR_NO_SERVICE:
                        if (listener != null) {
                            listener.onNoService();
                        }
                        break;
                    case SmsManager.RESULT_ERROR_NULL_PDU:
                        if (listener != null) {
                            listener.onNullPdu();
                        }
                        break;
                    case SmsManager.RESULT_ERROR_RADIO_OFF:
                        if (listener != null) {
                            listener.onRadioOff();
                        }

                        break;
                }
            }
        }, new IntentFilter(SENT));


        SmsManager sms = SmsManager.getDefault();


        sms.sendTextMessage(Holder.getMobNumber(), null, Holder.getMessage(), sentPI, null);
    }

我的主要活动

SendSMS sms = new SendSMS(MainActivity.this);
        sms.setMessage("Hello");
        sms.setNumber("123456789");
        sms.sendMessage();
        sms.OnSMSListener(new SendSMS.OnSMSListener() {
            @Override
            public void onSmsSent() {
                Toast.makeText(MainActivity.this, "SMS Sent", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onGenericFailure() {
                Toast.makeText(MainActivity.this, "Generic Failure", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onNoService() {
                Toast.makeText(MainActivity.this, "No Service", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onNullPdu() {
                Toast.makeText(MainActivity.this, "Null PDU", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onRadioOff() {
                Toast.makeText(MainActivity.this, "Radio Off", Toast.LENGTH_SHORT).show();
            }
        });

【问题讨论】:

  • 你在哪里注册你的听众?
  • 当你调用sms.sendMessage()时,listenerSendSMS中为null,因为你还没有调用OnSMSListener(),所以在ImplSendSms.sendTextMessage(listener)中传递了null。
  • 请将您的 OnSMSListener 设置器重命名为 setOnSMSListener

标签: java android interface callback sms


【解决方案1】:

您在调用sendMessage() 后设置监听器。更改为以下内容:

    sms.OnSMSListener(new SendSMS.OnSMSListener() {
        @Override
        public void onSmsSent() {
            Toast.makeText(MainActivity.this, "SMS Sent", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onGenericFailure() {
            Toast.makeText(MainActivity.this, "Generic Failure", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onNoService() {
            Toast.makeText(MainActivity.this, "No Service", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onNullPdu() {
            Toast.makeText(MainActivity.this, "Null PDU", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onRadioOff() {
            Toast.makeText(MainActivity.this, "Radio Off", Toast.LENGTH_SHORT).show();
        }
    });
    sms.sendMessage();

PS。您的 OnSMSListener 应该是 setOnSMSListener()

【讨论】:

  • 是的,感谢您的捕获,现在可以正常工作了,但是我如何限制用户首先使用 sendMessage() 然后实现监听器
  • setMessage( OnSMSListener smsListener )SendSMS 类的构造函数中提供监听器。
猜你喜欢
  • 2016-04-26
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
  • 2019-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多