Android 我想学习如何以异步任务方式加载图像,并在listViewAdapter中加载这些图像

Android 我想学习如何以异步任务方式加载图像,并在listViewAdapter中加载这些图像,android,android-listview,android-asynctask,listadapter,loadimage,Android,Android Listview,Android Asynctask,Listadapter,Loadimage,各位,, 我遇到了一个问题,我使用listView显示本地资源中的数百幅图像,并将图像设置为全屏。每个列表项中都有一个带有imageView和TextView的项目。但是当我滑到下一个项目时,这不是很顺利。我使用ImageFactory.options来调整图像的比例。但是问题仍然存在。我想也许我应该使用asynctask加载和图像缓存来解决这个问题。 这是我的代码,希望各位朋友指出我的问题。非常感谢 package com.jafir.project.adapter; import jav

各位,, 我遇到了一个问题,我使用listView显示本地资源中的数百幅图像,并将图像设置为全屏。每个列表项中都有一个带有imageView和TextView的项目。但是当我滑到下一个项目时,这不是很顺利。我使用ImageFactory.options来调整图像的比例。但是问题仍然存在。我想也许我应该使用asynctask加载和图像缓存来解决这个问题。 这是我的代码,希望各位朋友指出我的问题。非常感谢

package com.jafir.project.adapter;


import java.util.List;
import java.util.Map;

import com.jafir.project.porunacabeza.R;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView.RecyclerListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class PicListViewAdapter extends BaseAdapter  {
    private Context context;
    private Resources resources;
    private LayoutInflater inflater;
    private ViewHolder holder;
    private List<Map<String, Object>> list;
    public PicListViewAdapter(Context context,List<Map<String, Object>> list) {
        this.list = list;
        this.context = context;
        this.inflater = LayoutInflater.from(context);
        resources = context.getResources();
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int arg0) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if(convertView == null) {
             convertView = inflater.inflate(R.layout.item_pic, null);
            holder =  new ViewHolder();
            holder.imageView = (ImageView) convertView.findViewById(R.id.img_pic);
            holder.textView = (TextView) convertView.findViewById(R.id.txt_pic);
            convertView.setTag(holder);

        }else {
            holder = (ViewHolder) convertView.getTag();
        }
        int resID = (Integer) list.get(position).get("image");
        String text = (String) list.get(position).get("text");
        holder.imageView.setImageBitmap(decodeBitmap(resources, resID, holder.imageView.getWidth(),          holder.imageView.getHeight()));
        holder.textView.setText(text);
        notifyDataSetChanged();
        return convertView;
    }

    public Bitmap decodeBitmap(Resources res,int id,int width,int height){
        BitmapFactory.Options  options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(res,id,options);
        options.inSampleSize = getInSampleSize(options,width,height);
        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeResource(res,id,options);
    }

    public int getInSampleSize(BitmapFactory.Options options,int reqWidth,int reqHeight){
        final int width  = options.outWidth;
        final int height = options.outHeight;
        int inSampleSize = 1;
        if(height > reqHeight || width > reqWidth) {
            int radioWidth = Math.round((float)width/(float)reqWidth);
            int radioHeight = Math.round((float)height/(float)reqHeight);
            inSampleSize = radioHeight < radioWidth ?radioHeight:radioWidth;
        }
        return inSampleSize;
    }

      final static class ViewHolder{
            ImageView imageView;
            TextView textView;
        }
}
package com.jafir.project.adapter;
导入java.util.List;
导入java.util.Map;
导入com.jafir.project.porunacabeza.R;
导入android.content.Context;
导入android.content.res.Resources;
导入android.graphics.Bitmap;
导入android.graphics.BitmapFactory;
导入android.os.Handler;
导入android.os.Message;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.AbsListView.RecyclerListener;
导入android.widget.BaseAdapter;
导入android.widget.ImageView;
导入android.widget.TextView;
公共类PicListViewAdapter扩展了BaseAdapter{
私人语境;
私人资源;
私人充气机;
私人持票人;
私人名单;
公共PicListViewAdapter(上下文、列表){
this.list=列表;
this.context=上下文;
this.inflater=layoutiner.from(上下文);
resources=context.getResources();
}
@凌驾
public int getCount(){
返回list.size();
}
@凌驾
公共对象getItem(int arg0){
返回null;
}
@凌驾
公共长getItemId(int位置){
返回0;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
if(convertView==null){
convertView=充气机。充气(R.layout.item_pic,空);
holder=新的ViewHolder();
holder.imageView=(imageView)convertView.findViewById(R.id.img_pic);
holder.textView=(textView)convertView.findViewById(R.id.txt_pic);
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}
int resID=(整数)list.get(位置).get(“图像”);
String text=(String)list.get(position.get(“text”);
holder.imageView.setImageBitmap(解码位图(参考资料,resID,holder.imageView.getWidth(),holder.imageView.getHeight());
holder.textView.setText(文本);
notifyDataSetChanged();
返回视图;
}
公共位图解码位图(资源分辨率、整数id、整数宽度、整数高度){
BitmapFactory.Options=new-BitmapFactory.Options();
options.inJustDecodeBounds=true;
解码资源(资源、id、选项);
options.inSampleSize=getInSampleSize(选项、宽度、高度);
options.inJustDecodeBounds=false;
返回BitmapFactory.decodeResource(res、id、options);
}
public int getInSampleSize(BitmapFactory.Options选项、int-reqWidth、int-reqHeight){
最终整数宽度=options.outWidth;
最终内部高度=options.outHeight;
int inSampleSize=1;
如果(高度>要求高度| |宽度>要求宽度){
int radioWidth=数学圆((浮点)宽度/(浮点)宽度);
int radioHeight=数学圆((浮动)高度/(浮动)要求高度);
inSampleSize=radioHeight
这是针对活动的:

 private void init() {
        listView = (ListView) getActivity().findViewById(R.id.lst_pic);
        list = new ArrayList<Map<String,Object>>();
        for(int i=0;i < texts.length;i++){
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("image", R.drawable.img0+ i);
            map.put("text", texts[i]);
            list.add(map);
        }
        listView.setAdapter(new PicListViewAdapter(getActivity(), list));
    }
private void init(){
listView=(listView)getActivity().findViewById(R.id.lst_pic);
列表=新的ArrayList();
for(int i=0;i
这是针对item.xml的:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:orientation="vertical"
 >

    <ImageView android:id="@+id/img_pic"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        />
    <TextView android:id="@+id/txt_pic"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="15dp"
        android:gravity="center_horizontal"
        android:layout_gravity="center_horizontal"
        />


</LinearLayout>

Android官方网站上有一个全面的指南,请访问

该课程包含以下主题:

高效加载大型位图 本课程将指导您在不超过每个应用程序内存限制的情况下解码大型位图

在UI线程外处理位图 位图处理(调整大小、从远程源下载等)不应在主UI线程上进行。本课程将引导您使用AsyncTask在后台线程中处理位图,并解释如何处理并发问题

缓存位图 本课程将指导您如何使用内存和磁盘位图缓存来提高加载多个位图时UI的响应能力和流动性

管理位图内存 本课程介绍如何管理位图内存以最大限度地提高应用程序的性能

在用户界面中显示位图
本课程将所有内容结合在一起,向您展示如何使用背景线程和位图缓存将多个位图加载到ViewPager和GridView等组件中。

您的猜测是正确的。大约两年前,我使用tomgibara的ViewRenderer()测试了这个实现,结果是输出非常平滑。很好

如果我想尝试一下,我会尝试自己创造一个机制。 供参考的一些考虑因素:

  • 将解码后的位图放入LRUCache,这样您就不会得到 OutOfMemoryError。说真的,当您正在加载 很多图片
  • 根据需要使用AsyncTask/Loader/Raw线程。不多 本质上的差异
    • 如果我
      @Override
      public View getView(int position, View convertView, ViewGroup parent) {
      
          if(convertView == null) {
               convertView = inflater.inflate(R.layout.item_pic, null);
              holder =  new ViewHolder();
              holder.imageView = (ImageView) convertView.findViewById(R.id.img_pic);
              holder.textView = (TextView) convertView.findViewById(R.id.txt_pic);
              convertView.setTag(holder);
      
          }else {
              holder = (ViewHolder) convertView.getTag();
          }
          int resID = (Integer) list.get(position).get("image");
          String text = (String) list.get(position).get("text");
          //Picasso code
          Picasso.Builder builder = new Picasso.Builder(context);
          Picasso picasso = builder.build();
          picasso.load(resID).into(holder.imageView);
          //End Picasso code
          holder.textView.setText(text);
          notifyDataSetChanged();
          return convertView;
      }