2011-07-27 82 views
3

我正在开发的我的Android应用程序需要每5秒钟在我的服务器上请求一个页面,但是我担心这会是一个庞大的电池消费者,有没有更简单的方法?我目前的做法是每5秒循环一次的服务:我如何每5秒钟请求一次页面而不杀死电池?

protected void onHandleIntent(Intent intent) { 
     while (true){ 

      long endTime = System.currentTimeMillis() + 5*1000; 
      while (System.currentTimeMillis() < endTime) { 
       synchronized (this) { 
        try { 
         wait(endTime - System.currentTimeMillis()); 


        HttpClient httpclient = new DefaultHttpClient(); 
        HttpPost httppost = new HttpPost("http://www.***.***/***/request_sms.php"); 
        String HTML = ""; 
        try { 
         List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
         nameValuePairs.add(new BasicNameValuePair("id", "1")); 
         httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

         HttpResponse response = httpclient.execute(httppost); 
         HTML = EntityUtils.toString(response.getEntity()); 
        } catch (ClientProtocolException e) {} catch (IOException e) {} 


         if(HTML.indexOf("[NO TEXTS]") > 0) { 
         } else { 
          Vector<String> all_sms = getBetweenAll(HTML, "<sms>", "<sms>"); 
          for(int i = 0, size = all_sms.size(); i < size; i++) { 
           String from = getBetween(all_sms.get(i), "<from>", "</from>"); 
           String to = getBetween(all_sms.get(i), "<to>", "</to>"); 
           String msg = getBetween(all_sms.get(i), "<msg>", "</msg>"); 
           String sent = getBetween(all_sms.get(i), "<sent>", "</sent>"); 
           String HTML1 = ""; 
           HttpClient httpclient1 = new DefaultHttpClient(); 
           HttpPost httppost1 = new HttpPost("http://www.***.***/***/add_sms.php"); 
           try { 
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
            nameValuePairs.add(new BasicNameValuePair("from", from)); 
            nameValuePairs.add(new BasicNameValuePair("to", to)); 
            nameValuePairs.add(new BasicNameValuePair("msg", msg)); 
            nameValuePairs.add(new BasicNameValuePair("sent", sent)); 
            httppost1.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

            HttpResponse response1 = httpclient1.execute(httppost1); 
            HTML1 = EntityUtils.toString(response1.getEntity()); 
            HN.post(new DisplayToast(HTML1)); 
           } catch (ClientProtocolException e) {} catch (IOException e) {} 

          } 
         } 


         } catch (Exception e) { 
        } 
       } 
      } 

     } 


    } 
+0

缓存和请求较少似乎是一个明显的建议......不认为有更好的解决方法。抱歉。 –

回答

2

我会考虑使用Android C2DM(来自Android blog)。

基本上,您注册您的用户设备与您的服务器,并且您可以设置您的服务器推送通知到您的用户设备。然后,您可以将客户端更改为仅在服务器通知存在新数据时发出请求。

这应该工作得很好,因为您不需要经常提出请求。你一定会以这种方式节省电池寿命。

3

是否有一个原因,为什么它需要检查每隔5秒?您最好让服务器通过(通过c2dm)向设备推送更新时的通知。如果您不断地轮询服务器,无论您如何实施它,都会耗尽电池电量。

+0

C2dm非常完美!我从来没有新的有这样的工具。非常感谢。其更新频率非常高的原因是它更像是“即时通讯”服务。 – Qasim

+0

如果它将是更多的即时消息服务,你不愿意使用'Socket'并保持持久连接吗?我认为套接字在这种情况下可能比C2DM更好... –

+1

可能值得看看Android GTalk应用程序的来源,看看它在那里的处理方式:http://android.git.kernel.org/? p =平台/产品/应用/ IM.git –

0

对于类似于聊天的功能,Smack(和Asmack变体)库在Android开发人员中非常流行。它使用XMPP提供聊天图层。