0

私は 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();
        }

これらのコードを改善して、アプリケーション ヒープのすべてのメモリを解放し、メイン アクティビティを最初からやり直すにはどうすればよいですか? または、ログイン画面のメモリ使用量を減らすことしかできませんでした(これは本当に難しいとは思いません)。

ありがとうございました!

4

0 に答える 0