私はAndroid開発にかなり慣れていないので、Javaのメモリ不足の例外を把握できないようです。私のアプリがVMの予算を超えたことを意味していることは知っていますが、これを何度もグーグルした後でも、私はまだこの概念を理解していないようです。画面ごとに6つのボタンセレクターがあり、各セレクターに2つのビットマップがあり、[プロパティ]タブによるとそれぞれ約20 kbであるため、アプリがメモリを使いすぎているのではないかと心配しています。ルート化されたG2xで、VMバジェットを12 MBに設定し、電話を再起動して、問題なくアプリを実行しました。私は各onDestroy()でドローアブルのバインドを解除し、ここでも実行するようにGCをほのめかしています。エミュレーターでアプリをしばらく使用した後、DDMS画面で[Cause GC]をクリックすると、結果はID = 1、ヒープサイズ6.133 MB、割り当て済み2.895 MB、空き3.238 MB、使用率47.20、#オブジェクト52,623になります。
これは私が何が起こっているのか理解できないところです、私のエミュレーターは24MBのVMに設定されています。その番号はどこにありますか?私が抱えている実際の問題は、エミュレーターを16MBのVMに設定すると、2番目のアクティビティでアプリがクラッシュし、メモリ不足の例外が発生することです。VMが12MBに設定されている電話、または12MBのVMストックがある古いHTCMagic電話でクラッシュしないのはなぜですか?また、私のアプリはメモリを使いすぎていませんか?それらのDDMS番号が良いかどうかはわかりません。
私のコードに関しては、すべての画像をXMLレイアウトで指定しています。リスナーを追加する以外は、プログラムで何もしません。私はここでこのコードを見つけ、私が持っているすべてのアクティビティにそれを追加しました...
@Override
protected void onDestroy() {
super.onDestroy();
unbindDrawables(findViewById(R.id.myRootLayout));
System.gc();
}
private void unbindDrawables(View view) {
if (view.getBackground() != null) {
view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
((ViewGroup) view).removeAllViews();
}
}
onClickListeners
それ以外の場合は、PNGの背景を持つボタンに追加するだけです。プログラムでボタンの背景を指定する方法を学びたいのですが、ユーザーの操作に応じてボタンの背景を変更するには、フォーカス、プレス、フォーカスなし、プレスなどのセレクター機能が必要です。これに関するドキュメントを確認しましたが、圧倒されるようです。そのため、ここからヒープの管理の基本から始めて、コードでセレクターを指定するまでの道を進んでいくと思いました。これは意味がないかもしれませんが、メモリ不足の例外に近づくことなくアプリが割り当てることができる「正常な」量のメモリ割り当てはありますか?たとえば、アプリが6MBを割り当てた場合、それは問題ないはずですが、8MBがそれをプッシュしますが、メモリ割り当てにそのような境界はありますか?