私のアプリケーションを使用している人が少数で、数日後に電話が応答しなくなり、アプリが死んでいないとちょっと変わってしまいます。メモリリークを発見するのに役立つもの
私はメモリ管理について少し助けてください。私はいくつかの質問があります:
1)私はアプリケーション内で静的なクラスまたは変数への参照をほとんど作成しません。私は本質的にシングルトンである(独自のファイル内に)クラスを持っています。このクラスにはメソッドがあります。変数などはありません。私のアプリケーションはWebサービスコールを大量に使用し、このクラスはそのためのアクセスポイントです。このクラスのメソッドを呼び出すと、実際のWebサービス呼び出しを行うIntentServiceが起動します。ここに例があります。 callWebService方法もMyIntentServiceで静的int型ですMyIntentService.JOB_DELETEとMyIntentService.ITEM_ALLを、参照することに注意してください:私の活動の
public class MySingleton {
private static MySingleton mInstance = null;
protected MySingleton() { }
public synchronized static MySingleton getInstance() {
if (mInstance == null) {
mInstance = new MySingleton();
}
return mInstance;
}
public void callWebService(Context appContext, int intUserId) {
Intent intent = new Intent();
intent.setClass(appContext, MyIntentService.class);
intent.putExtra("job", MyIntentService.JOB_DELETE);
intent.putExtra("data_type", MyIntentService.ITEM_ALL);
intent.putExtra("user_id", intUserId);
appContext.startService(intent);
}
}
、私は呼ん:
MySingleton.getInstance().callWebService(getApplicationContext(), ((MyApplication)getApplicationContext()).getUserId());
私は何がありますここで間違っている?このシングルトンはメソッドのみで構成されているため、シングルトンではなく、すべてのメソッドを静的にする方が良いでしょうか?
2)カーソル。
私はCursorAdaptersを使用するいくつかのアクティビティを持っています。私は、AsyncQueryHandlerを使用してCursorをクエリします。 AsyncQueryHandlerがCursorを受け取ると、CursorAdapterでchangeCursorを呼び出し、この新しいCursorを渡します。私のCursorAdapterのchangeCursorハンドラでは、Cursorをsuperに渡してから、自分のActivityのprivate Cursorメンバー変数をこのCursorに設定し、startManagingCursorを呼び出します。
この後、私はonPause()またはonStop()メソッドで何もしないで、カーソルの管理を停止するか、またはそれを無効にします。これは間違っていますか?私は少しのテストを実行することによっていくらかの漏れがあるかもしれないと思っています。 ListViewをスクロールして画面を回転すると、アクティビティが「破棄」され、再作成され、新しいCursorが照会され、ListViewが自動的に画面が回転する前の位置にスクロールされます。それは明らかに前のCursorにアクセスできますか?私はAndroidがどうやってこれをやっているのか本当にわからない。
私がmCursor.close()を呼び出した場合、 onStop()ハンドラでは、問題が発生します。画面が回転して表示されると、ユーザーはスクロール位置を失います。これは明らかに望ましくない。では私は何をしますか?スクロール位置を取得し、カーソルを閉じてから、スクロール位置をsavedInstanceStateに渡しますか?
3)ブラストされたDDMSをスタンドアロンで実行するにはどうすればよいですか?私がEclipseを開いて開くと、すでに実行中のDDMSのインスタンスが呼び出され、閉じます。 Eclipseを閉じてエミュレータを起動し、スタンドアロンのDDMSを起動すると、何も表示されません。
4)私のAndroidの経験(この投稿や他のものに基づいて)について知っていることを考えれば、他に何を探しているべきですか?私はRomain Guyによっていくつかの記事を読みましたが、私は潜在的な問題を取り除きましたが、確かに私はまだ実現していません。
メモリに関する問題、特にオブジェクトの保持に関するツールを見つけるための便利なツール:Eclipse MATでアプリケーションのHPROFダンプを確認することをおすすめします(http://community.developer.motorola.com/t5/MOTODEV-Studio-for-Android-Blog/MOTODEV-Studio/ba-p/9591は、Motodevスタジオを使用すると良い説明です。 HPROFダンプを取ってMATにロードするだけです)。 –