Java 正确使用通用图像加载器

Java 正确使用通用图像加载器,java,android,photo-gallery,universal-image-loader,Java,Android,Photo Gallery,Universal Image Loader,好的,我已经尝试优化我的照片库好几天了(这是我的第一个Android项目)。所有照片均通过网页加载。我已经开始使用通用图像加载器,但我仍然对结果不满意 这是我的班级: public class Galerija extends Activity { ArrayList<RSSItem> lista = new ArrayList<RSSItem>(); ArrayList<String> lst_slika = new ArrayList<String

好的,我已经尝试优化我的照片库好几天了(这是我的第一个Android项目)。所有照片均通过网页加载。我已经开始使用通用图像加载器,但我仍然对结果不满意

这是我的班级:

public class Galerija extends Activity {

ArrayList<RSSItem> lista = new ArrayList<RSSItem>();
ArrayList<String> lst_slika = new ArrayList<String>();
RSSItem tempItem = new RSSItem();
ImageAdapter adapter;
ImageLoader imageLoader;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_galerija);

    try 
    {
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();
        XMLReader myReader = sp.getXMLReader();

        URL url = new URL("http://erdut.gausstesting.info/generateXML/galerija.php");

        XMLHandler myXMLHandler = new XMLHandler();
        myReader.setContentHandler(myXMLHandler);
        myReader.parse(new InputSource(url.openStream()));
        lista = myXMLHandler.getRss_lista();
        lst_slika = lista.get(0).getImages();

    } catch (Exception e) {
        System.out.println(e);
    }

    adapter = new ImageAdapter(this, lst_slika);
    GridView gridview = (GridView) findViewById(R.id.gridview);
    gridview.setAdapter(adapter);

    gridview.setOnItemClickListener(new OnItemClickListener() {

        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            // TODO Auto-generated method stub

        }
    });

} 

public class ImageAdapter extends BaseAdapter {
    private Context mContext;
    private ArrayList<String> lista;   
    /*
    final ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this.mContext)
    .enableLogging()
    .memoryCacheSize(41943040)
    .discCacheSize(104857600)
    .threadPoolSize(10)
    .build();
    */
    final DisplayImageOptions options = new DisplayImageOptions.Builder()
    .showStubImage(R.drawable.ic_stub)
    .showImageForEmptyUri(R.drawable.ic_empty)
    .showImageOnFail(R.drawable.ic_error)
    .cacheInMemory()
    .cacheOnDisc()
    .build();

    public ImageAdapter(Context c, ArrayList<String> lista) {
        this.mContext = c;
        this.lista = lista;
        imageLoader = ImageLoader.getInstance();
        //imageLoader.init(config);
        imageLoader.init(ImageLoaderConfiguration.createDefault(c));
    }

    public int getCount() {
        return lista.size();
    }

    public Object getItem(int position) {
        return null;
    }

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

    // create a new ImageView for each item referenced by the Adapter
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView;

        if (convertView == null) {  // if it's not recycled, initialize some attributes
            imageView = new ImageView(mContext);
            //ova 3 polja označavaju veličinu, cropanje i padding prikazanih slika
            imageView.setLayoutParams(new GridView.LayoutParams(150, 150));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setPadding(0, 0, 0, 0);
        } else {
            imageView = (ImageView) convertView;
        }

        imageLoader.displayImage(lista.get(position), imageView, options);
        //new ImageDownloadTask(imageView).execute(lista.get(position));

        return imageView;
    }
}
公共类Galerija扩展活动{
ArrayList lista=新的ArrayList();
ArrayList lst_slika=新的ArrayList();
RSSItem tempItem=新的RSSItem();
图像适配器;
图像加载器;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_galerija);
尝试
{
SAXParserFactory spf=SAXParserFactory.newInstance();
SAXParser sp=spf.newSAXParser();
XMLReader myReader=sp.getXMLReader();
URL=新URL(“http://erdut.gausstesting.info/generateXML/galerija.php");
XMLHandler myXMLHandler=新的XMLHandler();
setContentHandler(myXMLHandler);
parse(新的InputSource(url.openStream());
lista=myXMLHandler.getRss_lista();
lst_slika=lista.get(0.getImages();
}捕获(例外e){
系统输出打印ln(e);
}
适配器=新的图像适配器(此,lst_slika);
GridView GridView=(GridView)findViewById(R.id.GridView);
setAdapter(适配器);
setOnItemClickListener(新的OnItemClickListener(){
公共链接(AdapterView arg0、视图arg1、内部arg2、,
长arg3){
//TODO自动生成的方法存根
}
});
} 
公共类ImageAdapter扩展了BaseAdapter{
私有上下文;
私人ArrayList lista;
/*
最终ImageLoaderConfiguration配置=新建ImageLoaderConfiguration.Builder(this.mContext)
.enableLogging()
.memoryCacheSize(41943040)
.discCacheSize(104857600)
.线程池大小(10)
.build();
*/
final DisplayImageOptions=new DisplayImageOptions.Builder()
.showtubimage(R.drawable.ic_存根)
.showImageForEmptyUri(R.drawable.ic_empty)
.showImageOnFail(R.drawable.ic_错误)
.cacheInMemory()
.cacheOnDisc()
.build();
公共ImageAdapter(上下文c,ArrayList lista){
this.mContext=c;
this.lista=lista;
imageLoader=imageLoader.getInstance();
//init(config);
init(ImageLoaderConfiguration.createDefault(c));
}
public int getCount(){
返回lista.size();
}
公共对象getItem(int位置){
返回null;
}
公共长getItemId(int位置){
返回0;
}
//为适配器引用的每个项目创建新的ImageView
公共视图getView(int位置、视图转换视图、视图组父视图){
图像视图图像视图;
如果(convertView==null){//如果它没有被回收,初始化一些属性
imageView=新的imageView(mContext);
//ova 3 polja označavaju veličinu,cropanje i padding prikazanih slika
setLayoutParams(新的GridView.LayoutParams(150150));
imageView.setScaleType(imageView.ScaleType.CENTER\U裁剪);
setPadding(0,0,0,0);
}否则{
imageView=(imageView)convertView;
}
imageLoader.displayImage(lista.get(位置)、imageView、选项);
//新建ImageDownloadTask(imageView).execute(lista.get(position));
返回图像视图;
}
}
}

与我以前的解决方案相比,它确实加快了速度,但我并不满足。首先,我甚至不能在我的HTC难以置信的S上启动它-只是启动一个黑屏活动,没有任何加载。为什么呢

它只在emulator上工作,但它会在您滚动时重新加载所有图像。因此,一旦您向下滚动并备份,所有图像都会重新加载。这就是它的工作原理吗?我还有什么可以改进的方法吗


提前谢谢

> P>您应该考虑使用AssicTebug从服务器获取URL。

您应该使用视图保持架来平滑滚动和提高性能。 . 讨论的是视图持有者和listview性能

。检查配置和显示选项下的主题。

您应该将图像缓存在手机内存或SD卡中,而不是再次下载

它使用url作为密钥将图像缓存在SD卡中(如果您已正确配置)。如果存在,则从缓存中显示,否则下载、缓存和显示图像

在自定义适配器构造函数中

 File cacheDir = StorageUtils.getOwnCacheDirectory(activity context, "your folder");//for caching

 // Get singletone instance of ImageLoader
 imageLoader = ImageLoader.getInstance();
 // Create configuration for ImageLoader (all options are optional)
 ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(a)
 // You can pass your own memory cache implementation
.discCache(new UnlimitedDiscCache(cacheDir)) // You can pass your own disc cache implementation
.discCacheFileNameGenerator(new HashCodeFileNameGenerator())
.enableLogging()
.build();
// Initialize ImageLoader with created configuration. Do it once.
imageLoader.init(config);
options = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.showImageOnLoading(R.drawable.default_pic)//display stub image until image is loaded
.displayer(new RoundedBitmapDisplayer(20))
.build();
在getView()中


谢谢,这起作用了,速度提高了一点。我将把解析转移到AsyncTask,并查看这些视图持有者以进一步提高性能。唯一的问题是它在我的手机上仍然不起作用。我有一大堆其他的listview活动,它们工作得很好,但是photogallery什么也不加载。不过,在emulator中一切正常。我在应用程序中使用uil从picasa下载大型图像,解析json的ImageURL。它在我的设备中运行良好。如果你做得正确,我看不出有任何理由它不适合你。如果你使用viewholder,它应该可以工作。实现viewholderOk,今晚晚些时候我将尝试使用viewholder。或者改变布局XML文件中的一些参数。
viewholder.image=(ImageView)vi.findViewById(R.id.imageview); 
imageLoader.displayImage(imageurl, viewholder.image,options);//provide imageurl, imageview and options.