如何在Android中执行来自BroadcastReceiver的异步web请求

如何在Android中执行来自BroadcastReceiver的异步web请求,android,android-service,android-broadcast,Android,Android Service,Android Broadcast,我的Android应用程序中有一个WakefulBroadcastReceiver,它成功地接收到设备的传入短信。接下来,我尝试做的是使用GoogleVolley库向我的web服务器提交请求。问题是,Volley异步发出这个web请求。因此,BroadcastReceive中的“onReceive”方法代码在异步web请求完成之前完成。我知道,在使用BroadcastReceiver进行异步请求时,这是一个问题,但我是通过服务发出请求的(而不是直接在BroadcastReceiver中),所以我

我的Android应用程序中有一个WakefulBroadcastReceiver,它成功地接收到设备的传入短信。接下来,我尝试做的是使用GoogleVolley库向我的web服务器提交请求。问题是,Volley异步发出这个web请求。因此,BroadcastReceive中的“onReceive”方法代码在异步web请求完成之前完成。我知道,在使用BroadcastReceiver进行异步请求时,这是一个问题,但我是通过服务发出请求的(而不是直接在BroadcastReceiver中),所以我不明白为什么会发生这种情况

我收到以下NULLPOINTEREXCEPTION,我假设这是因为在请求完成之前,BroadcastReceiver的上下文已被破坏:



以下是WakefulBroadcastReceiver(SMSReiver)的代码:

以下是IntentService(SmsIntentService)的代码:


非常感谢您在此提供的任何帮助。提前谢谢

谢谢@Aun和@commonware的提示。我的问题实际上是如何创建截击请求。Volley显然不处理作为null传递的输入参数值(即HTTP Get/Post参数)。因此,在将其添加到请求的参数映射之前,我必须检查每个参数是否为null:

Map<String, String> mapPostArgs = new HashMap<String, String>();
if(name != null) {
        mapPostArgs.put("name", name);
    }

GsonRequest<APIResponse<Integer>> request = new GsonRequest<APIResponse<Integer>>(
            uri,
            new TypeToken<APIResponse<Integer>>(){}.getType(),
            getRequestHeaders(),
            mapPostArgs,
            listener,
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    handleError(error);
                }//End method
            });
Map-mappastargs=new-HashMap();
if(name!=null){
mapPostArgs.put(“名称”,名称);
}
GsonRequest request=新的GsonRequest(
乌里,
新建TypeToken(){}.getType(),
getRequestHeaders(),
mapPostArgs,
听众,
新的Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
handleError(错误);
}//结束方法
});

非常感谢您的指导

我不知道截击,但您需要从
IntentService
提供的后台线程同步执行HTTP调用。否则,服务将完成,您的
唤醒锁将在HTTP调用完成之前释放。
public void onReceive(Context context, Intent intent) {
    //retrieve the SMS PDUs, from the intent extras
    Bundle pdusBundle = intent.getExtras();
    Object[] pdus = (Object[])pdusBundle.get("pdus");

    //create sms message object from the PDU
    SmsMessage message = SmsMessage.createFromPdu((byte[])pdus[0]);

    Intent service = new Intent(context, SmsIntentService.class);
    service.putExtra(SmsIntentService.EXTRA_SMS_MESSAGE, message.getMessageBody());

    //start the service, keeping the device awake while it is launching
    startWakefulService(context, service);
    setResultCode(Activity.RESULT_OK);
}//End method
protected void onHandleIntent(Intent intent) {
    if (intent != null) {
        Bundle extras = intent.getExtras();

        if(!extras.isEmpty()){ // has the effect of unparcelling the bundle
            String smsMessage = extras.getString(EXTRA_SMS_MESSAGE);

            submitVolleyServerRequestAsync(smsMessage);
        }//End if
    }//End if

    // Release the wake lock provided by the WakefulBroadcastReceiver
    SmsReceiver.completeWakefulIntent(intent);
}//End method
Map<String, String> mapPostArgs = new HashMap<String, String>();
if(name != null) {
        mapPostArgs.put("name", name);
    }

GsonRequest<APIResponse<Integer>> request = new GsonRequest<APIResponse<Integer>>(
            uri,
            new TypeToken<APIResponse<Integer>>(){}.getType(),
            getRequestHeaders(),
            mapPostArgs,
            listener,
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    handleError(error);
                }//End method
            });