2011-07-27 11 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 C2DMAndroid blog)を使用することを検討します。

基本的には、ユーザーのデバイスをサーバーに登録して、ユーザーのデバイスに通知をプッシュするようにサーバーを設定できます。新しいデータが存在することをサーバーが通知したときにのみ、その要求を行うようにクライアントを変更できます。

これはうまくいかなければなりません。ほとんどの場合、ほとんどの場合、リクエストを行う必要はありません。あなたは間違いなくこのようにバッテリ寿命を節約します。

3

5秒ごとにチェックする必要がありますか?アップデートが利用可能になった時点で、サーバがc2dm経由でデバイスに通知を送信するほうがよいでしょう。あなたがサーバーを継続的にポーリングしているならば、それを実装する方法にかかわらずバッテリーを使い果たします。

+0

C2dmは完璧です!私はそのような道具が新しくない。どうもありがとう。それが非常に頻繁に更新される理由は、それが「インスタントメッセージング」サービスのようなものだからです。 – Qasim

+0

もっとインスタントメッセージングサービスになる場合は、むしろ 'ソケット'を使用して永続的な接続を維持しませんか?私はソケットがこの場合C2DMよりもうまくいくかもしれないと思う... –

+1

それはそれがそこで処理される方法を見るためにAndroid GTalkアプリのソースを見て価値があるかもしれません:http://android.git.kernel.org/? p = platform/packages/apps/IM.git –

0

Smack(およびAsmackバリアント)ライブラリは、Android開発者には人気があります。 XMPPを使用してチャットレイヤーを提供します。

関連する問題