使用Mob短信sdk遇到的问题,解决

项目需求:支付密码修改,只可以通过手机修改支付密码,1没有绑定手机的先绑定手机2,绑定手机了可以直接修改密码。(次要)

主要问题就在绑定手机上,如果绑定了手机想要更换要先解绑原来的手机,解绑后可以绑定新手机。

最主要的问题在与先解绑手机A,然后再绑定新手机B,设为A界面与B界面。

好了废话不多说了,进入正题。

 

解绑手机,与绑定新手机都要初始化短信sdk(也可以不指初始化一个,但是在要求B界面中收到验证码又要对B中的控件进行setEnable操作,所以不适合只在A中初始化sdk),我选择的是在两个页面都初始化了sdk。两个界面都复写了ondestory()函数,如下:

@Override

 protected void onDestroy() {

  // TODO Auto-generated method stub

  SMSSDK.unregisterAllEventHandler();

  Log.d("TAG", "UserSecuritySecondMobileSecond-->onDestroy");

  super.onDestroy();

 }

在新开的页面会初始化SMSSDK,代码如下:

private void initMobileSdk() {
  SMSSDK.initSDK(this, "523e80460f6c", "6763340f06586f22eaa128dbc2c2c0cd");
  EventHandler eh = new EventHandler() {
   @Override
   public void afterEvent(int event, int result, Object data) {
    Message msg = new Message();
    msg.arg1 = event;
    msg.arg2 = result;
    msg.obj = data;
    handler.sendMessage(msg);
   }
  };
  SMSSDK.registerEventHandler(eh);
 }

与他配套的Handler:

Handler handler = new Handler() {

  

  @Override

  public void handleMessage(Message msg) {

   // TODO Auto-generated method stub

   super.handleMessage(msg);

   int event = msg.arg1;

   int result = msg.arg2;

   Object data = msg.obj;

   if (result == SMSSDK.RESULT_COMPLETE) {

    // 短信注册成功后,返回MainActivity,然后提示新好友

    if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {// 提交验证码成功

     updateMobilecode(str_phone, str_code); // 先将验证码上传到服务器中,然后在handleMessage里上传手机及验证码

    } else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) {

     mBindPhone.setEnabled(true);

     mEt_phone.setEnabled(false);

     UIHelper.ToastMessage(UserSecuritySecondMobileThird.this,

       "验证码已经发送");

    }

   } else {

    ((Throwable) data).printStackTrace();

    UIHelper.ToastMessage(UserSecuritySecondMobileThird.this,

      "验证码错误,请重试");

   }

  }

 };

顺便写下,发送短信与发送验证码验证的函数:

发送短信:

SMSSDK.getVerificationCode("86", str_phone2);

发送验证码验证的函数:

SMSSDK.submitVerificationCode("86", str_phone, str_code);

问题来了,在解绑手机A中执行onDestroy()函数时,SMSSDK.unregisterAllEventHandler();里面是新开一个线程,将所有的事件Handler删除,这其中要花费多久我们无法得知,因为我们有不清楚具体的实现是什么样子的。如何在新开的线程完成执行完了SMSSDK.unregisterAllEventHandler();函数,在初始化新的SMSSDK(如果先初始化,unregisterAllEventHandler可能会把初始化的内容干掉),而且不影响用户体验。我的方法是这样的:

在新开的Activity B中,新开一个线程,sleep一段时间(1秒,因为用户1秒钟不可能输好了手机号码,点击发送,就算点击了发送,我们还要判断手机是不是正确,所以没必要担心)然后执行initMobileSdk的操作,如下:

/**
  * 处理延迟初始化initMobileSdk(),为什么延迟,因为要等待前面一个Activity中短信注册中
  * SMSSDK.unregisterAllEventHandler()完全结束了,才能初始化,不然初始化的就被
  * 这个函数给回收了
  */

 Handler handler1 = new Handler();

 Runnable mRunnable = new Runnable() {

  

  @Override

  public void run() {

   // TODO Auto-generated method stub

   try {

    Thread.sleep(1000);

    handler1.post(runnableui);

   } catch (InterruptedException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

   }

  }

 };

 

 Runnable runnableui = new Runnable() {

  

  @Override

  public void run() {

   // TODO Auto-generated method stub

   initMobileSdk();

  }

 };

注意处理发送短消息结果的Handler我们可以不采用延迟手段,也可以在runnableui中执行。

转载于:https://my.oschina.net/u/660536/blog/372799

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值