2014-01-08 40 views
3

我想向BroadcastReceiver的OnReceive事件上的URL发送HTTP POST请求,但我收到异常NetworkOnMainThreadException,如何在OnReceive事件上运行线程。如何在BroadcastReceiver事件上发送HTTP POST请求OnReceive事件

public void onReceive(Context context, Intent intent) { 
    final Bundle bundle = intent.getExtras(); 
    try 
    { 
     if (bundle != null) { 
      final Object[] pdusObj = (Object[]) bundle.get("pdus"); 
      for (int i = 0; i < pdusObj.length; i++) { 
       SmsMessage currentmessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]); 
       String phonenumber = currentmessage.getDisplayOriginatingAddress(); 

       String senderNum = phonenumber; 
       String message = currentmessage.getDisplayMessageBody(); 

       String msg = message.substring(5); 

       Log.i("SmsReceiver", "senderNum: "+ senderNum + "; message: " + msg); 

       int duration = Toast.LENGTH_LONG; 
       Toast toast = Toast.makeText(context, "senderNum: "+ senderNum + ", message: " + msg, duration); 
       toast.show(); 
       sendhttprequest("http://example.com/product", "rl", "12345678");      
      } 
     } 
    } 
    catch (Exception e) { 
     Log.e("SmsReceiver", "Exception smsReceiver" +e); 

    }  

} 

sendhttprequest是用来调用http post请求的函数。

请帮忙。

+1

据我所知,你试图做一个同步请求,尝试在AsyncTask中调用该方法,并查看是否有效。 –

+0

你能举个例子 –

+0

Yu还可以创建一个IntentService并从BroadcastReceiver中调用它。 –

回答

1

这个例子可以帮助你:

public void onReceive(Context context, Intent intent) { 
    final Bundle bundle = intent.getExtras(); 
    try { 
     if (bundle != null) { 
      final Object[] pdusObj = (Object[]) bundle.get("pdus"); 
      for (int i = 0; i < pdusObj.length; i++) { 
       SmsMessage currentmessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]); 
       String phonenumber = currentmessage.getDisplayOriginatingAddress(); 

       String senderNum = phonenumber; 
       String message = currentmessage.getDisplayMessageBody(); 

       String msg = message.substring(5); 

       Log.i("SmsReceiver", "senderNum: "+ senderNum + "; message: " + msg); 

       int duration = Toast.LENGTH_LONG; 
       Toast toast = Toast.makeText(context, "senderNum: "+ senderNum + ", message: " + msg, duration); 
       toast.show(); 
       new NetworkAccess().execute(); // Call AsyncTask     
      } 
     } 
    } 
    catch (Exception e) { 
     Log.e("SmsReceiver", "Exception smsReceiver" +e); 
    }  

    public class NetworkAccess extends AsyncTask<Void, Void, Void>{ 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      // call some loader 
     } 
     @Override 
     protected Void doInBackground(Void... params) { 
      // Do background task 
      sendhttprequest("http://example.com/product", "rl", "12345678"); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 

      super.onPostExecute(result); 
      // dismiss loader 
      // update ui 
     } 
    } 
} 
+0

谢谢老兄,这应该对我有帮助。 –