現在、Android2.2でアプリを開発を行っているのですが、
起動する毎にヒープメモリが増加していく状態に落ちいっております。
メモリリークが発生しているものと考えており、
Tracking Memory Allocationsツールを使って調査を行っているのですが、
分からない所があり、質問いたしました。
Histogramで、対象のActivityを表示した際に、下記のように表示されました。
(アクティビティ名→testActivity)
Class Name | Objects | Shallow
Heap | Retained Heap
-------------------------------------------------------------------------------------------
com.hoge.testActivity | 1 |
224 | >= 2,040
com.hoge.DatabaseHelper | 1 | 32
| >= 32
com.hoge.testActivity$2 | 1 |
32 | >= 32
com.hoge.testActivity$3 | 1 |
24 | >= 24
-------------------------------------------------------------------------------------------
com.hoge.testActivity$2やcom.hoge.testActivity$3について、
何を表しているのか分かりません。
タスクを表しているのかと思ったのですが、
起動時のIntentにはフラグは付けておらず、testActivityのマニフェストファイルには、
android:launchMode="singleTask" を設定しているため、
複数のタスクでは起動しないと考えております。
ご存知の方がおられましたら、ご教授いただけないでしょうか。
よろしくお願いいたします。
引き続き質問をさせていただきたいのですが、
AIDLを使いサービスとのバインド処理を行っているのですが、
画面を終了しても、
コールバックインターフェイス(ICallbackListener$Stud)
がActivityを掴んでいるようなのです。
2日ほど悩んでおりますが、開放方法が見つけられません。。
ご存知の方がおりましたら、
ご教授いただけないでしょうか。
下記のように実装しております。
※変数
private ICallbackListener mService = null;
※バインド
bindService(new Intent(ICallbackListener.class.getName()), connection,
Context.BIND_AUTO_CREATE);
※コールバックインターフェイス
private ICallbackListener listener = new ICallbackListener.Stub() {
public void receiveMessage(String message) throws RemoteException
{
handler.sendMessage(handler.obtainMessage(CALLBACK_MESSAGE,
message));
}
};
※コネクション
private ServiceConnection connection = new ServiceConnection() {
public void onServiceConnected(ComponentName name, IBinder
service) {
mService = ICallbackListener.Stub.asInterface(service);
try {
mService.addListener(listener);
} catch (RemoteException e) {
}
}
public void onServiceDisconnected(ComponentName name) {
mService = null;
}
};
※onDestroy(開放)
try {
if(mService != null){
mService.removeListener(listener);
unbindService(connection);
mService = null;
connection = null;
listener = null;
}
} catch (RemoteException e) {
}
どうかよろしくお願いいたします。
僕の場合、bindはonResumeで、unbindはonPauseでしています。bind/unbindはすぐに実行されず、完了まで時間がかか
ります。やったことがないので分かりませんが、onDestroyでunbindした場合、unbindが実際に終わるまでActivityは生きてい
るのでしょうか?それは大丈夫だとしても、onPauseでunbindする方が合理的だと思います。
トムキャットさん
返信いただき、ありがとうございます。
onPauseで実装しようと思っていたのですが、
バックグラウンドにいる時もServiceと接続しておきたかった為、
onDestroyで実装しています。
でも確かに、Activityが生きている間に、
アンバインド処理が完了しているか分かりませんよね。。
結果的には、
ツールで確認するとインスタンスとしては残っていましたが、
DDMSで確認すると使用メモリ量が少なくなると、Allocatedは開放されているようでした。
(メモリリークは解消された?)
スッキリとはしませんでしたので、
onPauseにして確認を行ってみたいと思います。
ありがとうございました。
On 12月17日, 午前12:19, トムキャット <dailyti...@gmail.com> wrote:
> トムキャットです。
>
> 僕の場合、bindはonResumeで、unbindはonPauseでしています。bind/unbindはすぐに実行されず、完了まで時間がかか
> ります。やったことがないので分かりませんが、onDestroyでunbindした場合、unbindが実際に終わるまでActivityは生きてい
> るのでしょうか?それは大丈夫だとしても、onPauseでunbindする方が合理的だと思います。
>