私は 1 週間ずっと、Android のヒープ メモリ制御を掘り下げていました。
ストーリーは、ログイン画面の背景をより HD のものに変更したことです。それは深刻な問題を引き起こしました。以前より多くのメモリを消費するため、残りのアクティビティ、特にそこから大きな画像を開くと、メモリ不足の問題が発生します。
DDMS を使用して分析した後、最終的に解決策を見つけました。開始時に画像にビットマップ コントロールを追加し、ユーザーがアクティビティを終了するとリサイクルします。これが私のコードです:
protected void findByViews() {
//Find all widgets view on the layout by ID
background = (RelativeLayout) findViewById(R.id.mainTableLayout);
Bitmap bm = BitmapFactory.decodeResource(this.getResources(), R.drawable.pbackground);
BitmapDrawable bd = new BitmapDrawable(this.getResources(), bm);
background.setBackgroundDrawable(bd);
}
ユーザーがアクティビティを終了または停止すると、次のようになります。
public void onPause() {
super.onPause();
java.lang.System.out.println("MAIN onPause");
//Clear Image from Heap.
BitmapDrawable bd = (BitmapDrawable)background.getBackground();
background.setBackgroundResource(0);
bd.setCallback(null);
bd.getBitmap().recycle();
}
これにより、残りのアプリケーションは約 40% ~ 50% の空きメモリで実行されます。それがちょうど10%未満で実行される前に。
しかし、これはグッドエンドではありません。別の問題が発生しました。ユーザーがログアウトしてメイン画面に戻る機能があります。ただし、ログイン画面自体を実行するには、ヒープの約 80% が必要です。実行時 (ログイン後) に、残りのアクティビティを実行するには約 50% ~ 60% が必要です。
簡単に言えば、実行時からメイン画面を再びランチするのに十分なヒープメモリがありません!.
終了して再起動するときのコードは次のとおりです。
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String serviceType = intent.getStringExtra("serviceType").trim();
System.out.println("serviceType:" + serviceType);
if (serviceType.equals("exit")) {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(
getCurrentActivity());
alertDialog.setTitle("Logout");
alertDialog.setMessage("Do you want to logout?");
alertDialog.setPositiveButton("Yes",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
// Unreg from App server so do not receive
// notification when logout
MultiData.getMultiData().serverLogOut();// never
// serverlogout
// before
// DeviceRegistrar.unregisterWithServer
ImageManagerMemCache.INSTANCE.clear();
Intent intent = null;
intent = new Intent(getCurrentActivity(),
main.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
// intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
});
alertDialog.setNegativeButton("No",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
// here you can add functions
}
});
alertDialog.show();
}
これらのコードを改善して、アプリケーション ヒープのすべてのメモリを解放し、メイン アクティビティを最初からやり直すにはどうすればよいですか? または、ログイン画面のメモリ使用量を減らすことしかできませんでした(これは本当に難しいとは思いません)。
ありがとうございました!