0

私のアプリケーションでは、メモリ リークの問題に直面しているため、バックグラウンドでビットマップ変換を実行したいと考えています。Async Task で実行できることはわかっていますが、これを行う方法がわかりません。以下に私のコードを掲載しています。

package com.android.album3;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;

public class Album3Activity extends Activity 
{
File [] mediaFiles;
File imageDir;
static GridView gridView;
ImageAdapter adapter;
Intent in;
String name = null;
ArrayList<Bitmap> bmpArray = new ArrayList<Bitmap>();
ArrayList<String> fileName = new ArrayList<String>();
public static final String TAG = "Album3Activity";
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    imageDir = new File(Environment.getExternalStorageDirectory().toString()+
             "/diplomat");
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    if(imageDir.exists())
    {
        setContentView(R.layout.grid);
        mediaFiles = imageDir.listFiles();
        //Log.d("Length of images",""+mediaFiles.length);
        for(File file : mediaFiles)
        {
            bmpArray.add(convertToBitmap(file));
            fileName.add(readFileName(file));
            Log.d(TAG + "bmpArray Size", ""+bmpArray.size());
            Log.d(TAG, "call to convertToBitmap");
        }//for

        adapter = new ImageAdapter(this, bmpArray, fileName);
        gridView = (GridView)findViewById(R.id.gridview);
        gridView.setAdapter(adapter);
        gridView.setOnItemClickListener(new OnItemClickListener() 
        {

        public void onItemClick(AdapterView<?> arg0, View arg1, int position,
                long arg3) 
        {
            in = new Intent(getApplicationContext(), FullScreen.class);
            in.putExtra("id", position);
            startActivity(in);
        }//onItemClick
    });
    }//if
    else
    {
        setContentView(R.layout.no_media);
        //Toast.makeText(Album3Activity.this, "No files available", Toast.LENGTH_SHORT).show();
    }//else
}//onCreate

public static Bitmap convertToBitmap(File file) 
{
    URL url = null;
    try 
    {
        url = file.toURL();
    }//try 
    catch (MalformedURLException e1) 
    {
        Log.d(TAG, e1.toString());
    }//catch

    Bitmap bmp = null;
    try
    {
       bmp = BitmapFactory.decodeStream(url.openStream());
       //bmp.recycle();
    }//try
    catch(Exception e)
    {
        Log.d(TAG, "Exception: "+e.toString());
    }//catch
    return bmp;
}//convertToBitmap

public String readFileName(File file)
{
    String name = file.getName();
    return name;
}//readFileName
}//class
4

1 に答える 1

0

画像サイズが大きいため、メモリのような問題に直面しています。このようなBitmapFactoryを使用してこの画像をデコードしました

BitmapFactory.Options option = new BitmapFactory.Options();
                option.inSampleSize = 2;//any integer value greater than 1
                Bitmap bm = BitmapFactory.decodeFile(root.getPath() + "/"
                        + imageName,option);
                imageView.setImageBitmap(bm);

値>1に設定すると、元の画像をサブサンプリングするようデコーダーに要求し、メモリを節約するために小さい画像を返します。サンプルサイズは、デコードされたビットマップの1つのピクセルに対応するいずれかの次元のピクセル数です。たとえば、inSampleSize == 4は、元の画像の幅/高さの1/4、ピクセル数の1/16の画像を返します。1未満の値は1と同じように扱われます。注:デコーダーはこの要求を実行しようとしますが、結果のビットマップは、要求されたものと正確に異なる次元を持つ場合があります。また、2の累乗は、多くの場合、デコーダーが尊重する方が高速で簡単です。

于 2012-05-19T06:42:21.450 に答える