2012-05-19 30 views
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 

回答

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解码这一形象,要求解码器二次采样原图像,返回一个较小的图像,以节省内存。样本大小是任一维度中与解码位图中的单个像素对应的像素数量。例如,inSampleSize == 4返回的图像是原始宽度/高度的1/4,以及像素数量的1/16。任何值< = 1的处理方式与处理1相同。注意:解码器将尝试完成此请求,但生成的位图可能具有与要求完全相同的不同尺寸。而且,2的幂次对于解码器来说通常更快/更容易。