Android 使用通用映像加载程序时出现内存不足错误,映像正在刷新
我正在使用通用图像加载器在ListView中将图像显示为缩略图,但是我遇到内存不足错误,当我滚动列表时,新视图显示的是第一视图的图像,而列表不在滚动阶段,但图像设置为正确的图像Android 使用通用映像加载程序时出现内存不足错误,映像正在刷新,android,android-listview,universal-image-loader,Android,Android Listview,Universal Image Loader,我正在使用通用图像加载器在ListView中将图像显示为缩略图,但是我遇到内存不足错误,当我滚动列表时,新视图显示的是第一视图的图像,而列表不在滚动阶段,但图像设置为正确的图像 public class NewAdapter extends BaseAdapter { private Activity activity; private ArrayList<String> movieThumbnail; private ArrayList<String
public class NewAdapter extends BaseAdapter {
private Activity activity;
private ArrayList<String> movieThumbnail;
private ArrayList<String> movieText;
private static LayoutInflater inflater=null;
static File cacheDir;
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(activity)
.memoryCache(new WeakMemoryCache())
.denyCacheImageMultipleSizesInMemory()
.discCache(new UnlimitedDiscCache(cacheDir))
.threadPoolSize(5)
.imageDownloader(new URLConnectionImageDownloader(120 * 1000, 120 * 1000))
.enableLogging()
.build();
DisplayImageOptions options = new DisplayImageOptions.Builder()
.cacheOnDisc()
.cacheInMemory()
.bitmapConfig(Bitmap.Config.RGB_565)
.imageScaleType(ImageScaleType.IN_SAMPLE_INT)
.build();
private ImageLoader imageLoader= ImageLoader.getInstance();
public NewAdapter(Activity a, ArrayList<String> movieThumbnail, ArrayList<String> movieText) {
activity = a;
/*data=d;*/
this.movieThumbnail = movieThumbnail;
this.movieText = movieText;
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
cacheDir=new File(android.os.Environment.getExternalStorageDirectory(),"JunkFolder");
else
cacheDir=activity.getCacheDir();
if(!cacheDir.exists())
cacheDir.mkdirs();
imageLoader.init(config);
}
public int getCount() {
return movieText.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
View vi=convertView;
if(convertView==null)
vi = inflater.inflate(R.layout.listrow, null);
TextView text=(TextView)vi.findViewById(R.id.rowListTextView);
ImageView image=(ImageView)vi.findViewById(R.id.movieImage);
text.setText(movieText.get(position));
imageLoader.displayImage(movieThumbnail.get(position), image, options);
return vi;
}
}
public类NewAdapter扩展了BaseAdapter{
私人活动;
私家侦探片;
私人编剧电影文本;
专用静态充气机=空;
静态文件cacheDir;
ImageLoaderConfiguration配置=新建ImageLoaderConfiguration.Builder(活动)
.memoryCache(新的WeakMemoryCache())
.DenycacheMageMultipleSizesInMemory()
.discCache(新的未限制的缓存(cacheDir))
.线程池大小(5)
.imageDownloader(新的URLConnectionImageDownloader(120*1000,120*1000))
.enableLogging()
.build();
DisplayImageOptions=new DisplayImageOptions.Builder()
.cacheOnDisc()
.cacheInMemory()
.bitmapConfig(Bitmap.Config.RGB_565)
.imageScaleType(imageScaleType.IN\u示例\u INT)
.build();
私有ImageLoader ImageLoader=ImageLoader.getInstance();
公共新适配器(活动a、ArrayList MovietHumbail、ArrayList MovietText){
活动=a;
/*数据=d*/
this.movieThumbnail=movieThumbnail;
this.movieText=movieText;
充气器=(LayoutInflater)activity.getSystemService(Context.LAYOUT\u充气器\u SERVICE);
if(android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_-MOUNTED))
cacheDir=新文件(android.os.Environment.getExternalStorageDirectory(),“JunkFolder”);
其他的
cacheDir=activity.getCacheDir();
如果(!cacheDir.exists())
cacheDir.mkdirs();
init(config);
}
public int getCount(){
返回movieText.size();
}
公共对象getItem(int位置){
返回位置;
}
公共长getItemId(int位置){
返回位置;
}
公共视图getView(int位置、视图转换视图、视图组父视图){
视图vi=转换视图;
if(convertView==null)
vi=充气机充气(R.layout.listrow,空);
TextView text=(TextView)vi.findViewById(R.id.rowListTextView);
ImageView image=(ImageView)vi.findViewById(R.id.movieImage);
text.setText(movieText.get(position));
imageLoader.displayImage(movieThumbnail.get(位置)、图像、选项);
返回vi;
}
}
下面是ImageView和TextView的Xml布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/text_relativelayout"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/latest_list_toggle" />
<ImageView
android:id="@+id/movieImage"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginLeft="12dp"
android:layout_marginTop="14dp" />
<TextView
android:id="@+id/rowListTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/movieImage"
android:paddingBottom="10dp"
android:paddingLeft="10dp"
android:paddingRight="21dp"
android:paddingTop="20dp"
android:text="@string/app_name"
android:textColor="@android:color/black"
android:textSize="17sp"
android:textStyle="bold" />
</RelativeLayout>
确保在ImageLoader中根据需要设置图像大小
// decodes image and scales it to reduce memory consumption
private Bitmap decodeFile(File f) {
try {
// decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(new FileInputStream(f), null, o);
// Find the correct scale value. It should be the power of 2.
final int REQUIRED_SIZE = 70;
int width_tmp = o.outWidth, height_tmp = o.outHeight;
int scale = 1;
while (true) {
if (width_tmp / 2 < REQUIRED_SIZE
|| height_tmp / 2 < REQUIRED_SIZE)
break;
width_tmp /= 2;
height_tmp /= 2;
scale *= 2;
}
// decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
} catch (FileNotFoundException e) {
}
return null;
}
//解码图像并对其进行缩放以减少内存消耗
私有位图解码文件(文件f){
试一试{
//解码图像大小
BitmapFactory.Options o=新的BitmapFactory.Options();
o、 inJustDecodeBounds=true;
解码流(新的FileInputStream(f),null,o);
//找到正确的刻度值。它应该是2的幂。
所需的最终int_尺寸=70;
内部宽度=o.向外宽度,高度=o.向外高度;
int标度=1;
while(true){
如果(宽度\u tmp/2<要求的\u尺寸
||高度(tmp/2<所需尺寸)
打破
宽度_tmp/=2;
高度_tmp/=2;
比例*=2;
}
//用inSampleSize解码
BitmapFactory.Options o2=新的BitmapFactory.Options();
o2.inSampleSize=刻度;
返回BitmapFactory.decodeStream(新文件输入流(f),null,o2);
}catch(filenotfounde异常){
}
返回null;
}
在DisplayImageOptions中设置.resetViewBeforeLoading()
。尝试下一步(全部或多个):
减少配置中的线程池大小(.threadPoolSize(…)。建议使用1-5。
使用
在显示选项中。RGB_565中的位图消耗的内存是ARGB_8888中的2倍。
使用
在配置中或在内存中禁用缓存
在显示选项中(不要调用.cacheInMemory())。
使用
在显示选项中。或尝试
.imageScaleType(ImageScaleType.EXACTLY).
避免使用RoundedBitmapDisplayer。它使用ARGB_8888 config创建新的位图对象,以便在工作期间显示。我解决了在listView刷新时设置正确图像的问题。前面我在调用Imageloader.displayImage()时没有传递DisplayImageOption的变量。现在它可以正常工作了我正在用基本适配器加载一个图像,其中我用毕加索在充气机imageview中设置了图像,并尝试使用图像加载程序,但是,当加载图像就地支架时,我的内存不足,通用图像加载程序和毕加索,特别是三星s4设备出现了异常,我也使用了最新的毕加索jar,但解决方案一无所获。我已经尝试了large hip=true和bitmap.recycle,但无法解决它
.memoryCache(new WeakMemoryCache())
.imageScaleType(ImageScaleType.IN_SAMPLE_INT)
.imageScaleType(ImageScaleType.EXACTLY).