2016-08-11 2 views
0

私は、アプリケーションが閉じられていても、無期限に実行する必要のあるサービスをアプリケーションに持っています。状態が変化した場合、サービスは通知をトリガする必要があります。サービスのpingをトリガするループは、ユーザが選択します。最小値は5000ms(5秒)です。私はUIスレッドへのトースト(一時的にプログラミング中)を送るためのハンドラスレッドへの呼び出しと別のスレッド(UIスレッド外)にpingを持っています。あなたがサービスから私のonStartCommandを見ることができる上記サービスはますます多くのメモリを使用しています

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    Toast successMessage = Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT); 
    successMessage.show(); 

    //sendToastOnUIThread(1000); 

    new Thread(new Runnable(){ 
     public void run() { 
      while(true) { 
       try { 
        Thread.sleep(GLOBAL_PING_TIMER); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 

       sendToastOnUIThread(); 
       //Code for pings here... 


      } 

     } 
    }).start(); 

    return START_STICKY; 
} 

-

これをテストするとき、私は唯一のネットワークソースにpingを実行するために上記のコードを使用して自分のコードを残しなど包みなさい、あなたは「sendToastOnUIThreadでいただきました不思議(); 'だから、

public void sendToastOnUIThread(){ 

    Handler h = new Handler(AutoPingServerService.this.getMainLooper()); 

    h.post(new Runnable() { 
     @Override 
     public void run() { 
      Toast.makeText(AutoPingServerService.this,"Servers Pinged",Toast.LENGTH_SHORT).show(); 
     } 
    }); 

} 

このサービスが実行されて、私は5秒ごとに乾杯を得るが、サービスのメモリがちょうど積み重ね続ける(8.5メガバイトでキャップするようだ)が、1メガバイトの周りから始まり、ちょうど0.1メガバイトの周りにたまりますループごとに。どういうわけか、あまりにも多くのスレッドを作っていますかUIスレッド、pingを処理する新しいスレッド、および必要なときにトーストをポストするハンドラスレッドのみが必要です(これは、一度動作すると通知に置き換えられます)

アイデアに開放的 - かなり新しいアンドロイド開発、私は間違ったスレッドの種類をすべて使用している場合私は驚かないだろう。おそらくこれは正常ですか?

EDIT:Spelling。好奇心誰のため

+0

私の最初の考えは、ガベージコレクタだけではまだ起動していないので、各ループで作成されているオブジェクト参照を収集していません。そうであれば、一定の時間が経過した後で落ちるはずです。いずれにせよ、あなたは 'IntentService'を調べたいかもしれません。 – DeeV

+0

@DeeV IntentServiceから離れた唯一の理由は(私が読んだところから)Serviceクラスは永続性を維持しやすく、IntentServiceがインテント用のサービスであり、アプリケーションが閉じられていないときの実際の計算用に設計されているまた、小さな仕事のためのIntentServiceではありませんか?この仕事は24時間365日実行する必要があります。 – AndroidStudent

+0

これが問題なのかどうかはわかりませんが、UIスレッドでトーストを送信するたびに新しいハンドラを作成したいとは思いません。ちなみに、ある時点でSystem.gc()を明示的に呼び出すとどうなりますか? – EJoshuaS

答えて

0

オーケー更新:

あなたは、端末容量に達するだろうと、メモリはしばらく(pweh)の後に拭いますありません。これが理想的かどうかわかりませんが、ちょっと - 私は何百万ものためにそれを販売するつもりはない、アプリがクラッシュした場合、私はこの投稿を更新します。壊れていないものを修正しないでください。

とにかく - @DeevはIntentServiceに移動する必要があると親切に言った、私はしなかった。私は将来可能でしょうが、このメソッドは機能します(IntentServiceを使う方が簡単に見えますが)。

関連する問題