2013-05-01 48 views
0

我目前有一个管理广播接收器的服务。该接收机可以关闭和打开。Android:在OnReceive方法中启动异步任务

当收到SMS时触发OnReceive。然后它将SMS上传到服务器。代码工作正常,但我听说从3.0以上的网络连接需要在Async任务上运行。即使不是这种情况,我想将上传移动到另一个线程,因此上传任务不能阻止UI线程。 (我已经累到服务移动到IntentService,这将导致广播接收器泄漏)

  SMSBR = new BroadcastReceiver(){ 

      @Override 
      public void onReceive(Context context, Intent intent) { 
       //START OF ONRECIVER************************ 
       Bundle extras = intent.getExtras(); 

       String strMessage = ""; 

       if (extras != null) 
       { 
        Object[] smsextras = (Object[]) extras.get("pdus"); 

        for (int i = 0; i < smsextras.length; i++) 
        { 
         SmsMessage smsmsg = SmsMessage.createFromPdu((byte[])smsextras[i]); 

         String strMsgBody = smsmsg.getMessageBody().toString(); 
         String strMsgSrc = smsmsg.getOriginatingAddress(); 

         strMessage += "SMS from " + strMsgSrc + " : " + strMsgBody;      

         Log.d("Message", "is "+strMessage); 
         //*************************************************************** 
         InputStream is = null; 
         try{ 
          HttpClient httpclient = new DefaultHttpClient(); 
          HttpPost httppost = new HttpPost("http://mayar.abertay.ac.uk/~1001077/insert.php"); 

          ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
           nameValuePairs.add(new BasicNameValuePair("DeviceNumber", telephonyManager.getLine1Number().toString())); 
           nameValuePairs.add(new BasicNameValuePair("SenderNumber", strMsgSrc)); 
           nameValuePairs.add(new BasicNameValuePair("Message", strMsgBody)); 
           httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
           HttpResponse response = httpclient.execute(httppost); 
           HttpEntity entity = response.getEntity(); 
           is = entity.getContent(); 
           Log.d("is = ", is.toString()); 
           Log.d("In SMS", "Sender success"); 
            if (Looper.getMainLooper().getThread() == Thread.currentThread()) { 
             Log.d("Message upload Running", "on UI"); 
            } else { 
             Log.d("Message upload NOT running", "on UIx"); 
            } 

         }catch (Exception e){ 
          Log.e("Log_tag", "Error in http sms " + e.toString()); 
          Log.d("In SMS", "Sender NOT success"); 
         } 
         //**************************************************************** 

        } 

       } 
       //END OF ON RECEIVE**************************** 
      } 


      }; 
+1

问题是什么?如何把它放在AsyncTask中?或者如果你应该使用一个AsyncTask?如果一个AsyncTask可以从调用onReceive()开始? – baske 2013-05-01 15:19:44

+0

@baske如何获取在AsyncTask中运行的上传? – Dan1676 2013-05-01 15:34:33

回答

1

我来回答你的问题,而不谈AsyncTasks: 看看

BroadcastReceiver.registerReceiver (广播接收器接收器, IntentFilter的过滤器,字符串broadcastPermission,处理程序调度器)

我发现,虽然我在检查上溴的一些文件oadcastReceivers,看起来像你所需要的(检查this link)。还有一个提示:将它与HandlerThread结合使用。