2013-05-01 3 views
0

В настоящее время у меня есть Служба, которая управляет широковещательным приемником. Этот приемник можно отключить и включить.Android: Запустите задачу Async в методе OnReceive

В настоящий момент OnReceive запускается при получении СМС. Затем он загружает SMS на сервер. Код работает нормально, но я слышал от 3.0 выше, сетевые подключения должны выполняться по задаче Async. Даже если это не так, я хотел бы переместить загрузку в другой поток, поэтому задача загрузки не может заблокировать поток пользовательского интерфейса. (Я устал, чтобы переместить службу к 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

+0

@baske Как я могу загрузить загрузку в AsyncTask? – Dan1676

ответ

1

Позвольте мне ответить на ваш вопрос, не говоря о AsyncTasks: Посмотрите на

BroadcastReceiver.registerReceiver (BroadcastReceiver приемник, IntentFilter фильтр, String broadcastPermission, Handler планировщик)

я обнаружил, что в то время как я проверял некоторую документацию на Br oadcastReceivers и выглядит точно, что вам нужно (отметьте this link). Еще один намек: используйте его в сочетании с HandlerThread.

Смежные вопросы