2013-03-29 6 views
3

좋아, 나는 지금 내 사진 갤러리를 며칠 동안 최적화하려고 노력 해왔다. (이것은 내 안드로이드 프로젝트 다.) 모든 사진은 웹 페이지를 통해로드됩니다. 유니버설 이미지 로더를 사용하기 시작했으나 결과가 만족스럽지 않습니다.유니버설 이미지 로더의 올바른 사용

여기 내 클래스의 :

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; 
    } 
} 

가}

그것은 내 이전 솔루션에 비해 일을 질주 확실히있다,하지만 난 만족하지입니다. 우선 HTC Incredible S에서 시작할 수 없습니다. 그냥 검은 색 화면이 나타나고 아무것도로드하지 않습니다. 왜 그런가요?

에뮬레이터에서만 작동하지만 스크롤 할 때 모든 이미지가 다시로드됩니다. 따라서 아래로 스크롤 한 다음 백업하면 모든 이미지가 다시로드 된 것처럼 보입니다. 그게 어떻게 일하는거야? 내가 이것을 향상시킬 수있는 다른 방법은 없을까?

미리 감사드립니다.

답변

9

서버에서 URL을 가져 오려면 asynctask를 사용해야합니다.

매끄러운 스크롤과 성능을 위해 뷰 홀더를 사용해야합니다. http://www.youtube.com/watch?v=wDBM6wVEO70. 이 대화는 뷰 홀더 및 목록보기 성능에 대한 것입니다.

http://developer.android.com/training/improving-layouts/smooth-scrolling.html

https://github.com/nostra13/Android-Universal-Image-Loader. 구성 및 표시 옵션에서 항목을 확인하십시오.

다시 다운로드하는 대신 이미지를 휴대 전화 메모리 또는 sdcard에 캐시해야합니다.

url을 키로 사용하여 sdcard (제대로 구성한 경우)에 이미지를 캐시합니다. 캐시의 현재 디스플레이가 다른 경우 다운로드, 캐시 및 표시 이미지. 근무하고 속도를 조금 증가 사용자 정의 어댑터 생성자 당신의 getView에서

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(); 

()

viewholder.image=(ImageView)vi.findViewById(R.id.imageview); 
imageLoader.displayImage(imageurl, viewholder.image,options);//provide imageurl, imageview and options. 
+0

감사에서

. 구문 분석을 AsyncTask로 이동하고 성능을 더욱 향상 시키려면 ViewHolders를 살펴 봅니다. 유일한 문제는 여전히 내 휴대 전화에서 작동하지 않는다는 것입니다. 나는 잘 작동하는 다른 listview 액티비티들을 가지고 있지만 photogallery는 아무 것도로드하지 않는다. 그러나 모든 것이 에뮬레이터에서 올바르게 작동합니다. –

+0

나는 내 응용 프로그램에서 picasa에서 json을 imageurls로 파싱하여 큰 이미지를 다운로드 할 때 uil을 사용했습니다. 그것은 내 장치에서 잘 작동했습니다. 네가 제대로하면 네가 잘 돌아 가지 못할 이유가 없어. – Raghunandan

+0

뷰홀을 사용하는 경우 잘 동작해야합니다. viewholder 구현 – Raghunandan