리스트뷰에서 이미지로드가 너무 오래걸려요ㅜㅜ

조회수 3535회

발생하는 문제 및 실행환경

이미지를 출력하는 리스트뷰를 만들었는데 제가 이미지를 인터넷에서 가져옵니다. 근데 출력하는 속도도 너무 느리고 이미지를 매번 다시불러오는것 같습니다.

p.s. 이미지 수는 제한이 없어요

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    이 소스 보시고 참고하세요. 화면에 표시된 이미지를 저장해서 매번 다시 안불러오고 쓰레드로 돌려서 렉 없이 쓸수 있습니다.

    package com.wilson.android.library;
    
    /*
        Licensed to the Apache Software Foundation (ASF) under one
        or more contributor license agreements.  See the NOTICE file
        distributed with this work for additional information
        regarding copyright ownership.  The ASF licenses this file
        to you under the Apache License, Version 2.0 (the
        "License"); you may not use this file except in compliance
        with the License.  You may obtain a copy of the License at
    
        http://www.apache.org/licenses/LICENSE-2.0
    
        Unless required by applicable law or agreed to in writing,
        software distributed under the License is distributed on an
        "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
        KIND, either express or implied.  See the License for the
        specific language governing permissions and limitations
        under the License.
    */
    import java.io.IOException;
    
    public class DrawableManager {
        private final Map<String, Drawable> drawableMap;
    
        public DrawableManager() {
            drawableMap = new HashMap<String, Drawable>();
        }
    
       public Drawable fetchDrawable(String urlString) {
            if (drawableMap.containsKey(urlString)) {
                return drawableMap.get(urlString);
            }
    
            Log.d(this.getClass().getSimpleName(), "image url:" + urlString);
            try {
                InputStream is = fetch(urlString);
                Drawable drawable = Drawable.createFromStream(is, "src");
    
    
                if (drawable != null) {
                    drawableMap.put(urlString, drawable);
                    Log.d(this.getClass().getSimpleName(), "got a thumbnail drawable: " + drawable.getBounds() + ", "
                            + drawable.getIntrinsicHeight() + "," + drawable.getIntrinsicWidth() + ", "
                            + drawable.getMinimumHeight() + "," + drawable.getMinimumWidth());
                } else {
                  Log.w(this.getClass().getSimpleName(), "could not get thumbnail");
                }
    
                return drawable;
            } catch (MalformedURLException e) {
                Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
                return null;
            } catch (IOException e) {
                Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
                return null;
            }
        }
    
        public void fetchDrawableOnThread(final String urlString, final ImageView imageView) {
            if (drawableMap.containsKey(urlString)) {
                imageView.setImageDrawable(drawableMap.get(urlString));
            }
    
            final Handler handler = new Handler() {
                @Override
                public void handleMessage(Message message) {
                    imageView.setImageDrawable((Drawable) message.obj);
                }
            };
    
            Thread thread = new Thread() {
                @Override
                public void run() {
                    //TODO : set imageView to a "pending" image
                    Drawable drawable = fetchDrawable(urlString);
                    Message message = handler.obtainMessage(1, drawable);
                    handler.sendMessage(message);
                }
            };
            thread.start();
        }
    
        private InputStream fetch(String urlString) throws MalformedURLException, IOException {            
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpGet request = new HttpGet(urlString);
            HttpResponse response = httpClient.execute(request);
            return response.getEntity().getContent();
        }
    }
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)