我的Android應用程序中有一個WakefulBroadcastReceiver,它已成功接收到設備的傳入SMS。在此之後,我試圖做的是使用Google Volley庫向我的Web服務器提交請求。問題在於,Volley是異步完成這個Web請求的。因此,BroadcastReceiver中的「onReceive」方法代碼在異步Web請求完成之前完成。我明白,當使用BroadcastReceiver與異步請求時,這是一個問題,但我通過服務(而不是直接在BroadcastReceiver中)發出請求,所以我不明白爲什麼會發生這種情況。如何在Android中執行來自BroadcastReceiver的異步Web請求
我收到以下NullPointerException異常,這我假設是因爲廣播接收器的情況下完成的請求之前已經被銷燬:
11-04 19:13:43.465 32385-32441/com.niiche.pinch E/Volley﹕ [5542] NetworkDispatcher.run: Unhandled exception java.lang.NullPointerException
java.lang.NullPointerException
at libcore.net.UriCodec.encode(UriCodec.java:132)
at java.net.URLEncoder.encode(URLEncoder.java:57)
at com.android.volley.Request.encodeParameters(Request.java:456)
at com.android.volley.Request.getBody(Request.java:442)
at com.android.volley.toolbox.HurlStack.addBodyIfExists(HurlStack.java:236)
at com.android.volley.toolbox.HurlStack.setConnectionParametersForRequest(HurlStack.java:210)
at com.android.volley.toolbox.HurlStack.performRequest(HurlStack.java:106)
at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:96)
at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:110)
下面是代碼WakefulBroadcastReceiver(SmsReceiver):
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
下面是Int entService(SmsIntentService):
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
任何可以在這裏提供的援助非常感謝。提前致謝!
我不知道Volley,但是你需要從'IntentService'提供的後臺線程同步執行你的HTTP調用**。否則,服務將會完成,你的'WakeLock'將在你的HTTP調用完成之前被釋放。 – CommonsWare 2014-11-05 00:30:38