私は、アプリケーションが閉じられていても、無期限に実行する必要のあるサービスをアプリケーションに持っています。状態が変化した場合、サービスは通知をトリガする必要があります。サービスの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。好奇心誰のため
私の最初の考えは、ガベージコレクタだけではまだ起動していないので、各ループで作成されているオブジェクト参照を収集していません。そうであれば、一定の時間が経過した後で落ちるはずです。いずれにせよ、あなたは 'IntentService'を調べたいかもしれません。 – DeeV
@DeeV IntentServiceから離れた唯一の理由は(私が読んだところから)Serviceクラスは永続性を維持しやすく、IntentServiceがインテント用のサービスであり、アプリケーションが閉じられていないときの実際の計算用に設計されているまた、小さな仕事のためのIntentServiceではありませんか?この仕事は24時間365日実行する必要があります。 – AndroidStudent
これが問題なのかどうかはわかりませんが、UIスレッドでトーストを送信するたびに新しいハンドラを作成したいとは思いません。ちなみに、ある時点でSystem.gc()を明示的に呼び出すとどうなりますか? – EJoshuaS