마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

리스트뷰 URL이미지 로딩시 AsyncTask 질문입니다.

0 추천
asynctask를 사용하여 뷰 생성시 마다

이미지를 다운하여 따로 저장해주는데요(해쉬맵이나 캐싱은 추후 붙일생각입니다)

 

3개의 이미지가 있어 asynctask를 3번 호출하게 되는데

부를때는 각각 다른 이름의 이미지 파일을 부르게 되고

 

결과는 3번을 3번째(마지막에 불린 이미지)이미지만 저장이 되더라구요..

따로도는 쓰레드? 아닌가요?? 왜 이런 상황이 발생할까요 ㅜㅜ

 

 

일단 제가 만든 메서드는

 

doinbackground 에서

try catch로 url 접속해서 사진을 받아오고 bitmap으로 decode합니다

 

다음 onpostExecute에서 파일로 만드는데

ㅇ예상으로는 파일 쓰기는 동시에 3개가 안돌아가는거 같습니다
익명사용자 님이 2015년 5월 12일 질문
2015년 5월 13일 수정

3개의 답변

0 추천
 
채택된 답변
저장할 때 파일명이 같으니 마지막에 요청한것만 저장되는것 아닙니까?

파일 쓰기가 동시에 3개가 안된다는 예상은 확실히 잘못됐습니다.
Gradler (109,780 포인트) 님이 2015년 5월 13일 답변
맞네요 ㅡ.ㅡ 마지막이름으로 냅따 때리고 있으니 3번째까만 저장되는걸로 보였네요 ㅜ;;
0 추천
AsyncTask 호출하는 코드 볼수 있을까요?
작전동 (5,890 포인트) 님이 2015년 5월 13일 답변
/*private class getBitmapFromURL extends AsyncTask<String, Void, Bitmap>
    {

        @Override
        protected Bitmap doInBackground(String... params) {
            HttpURLConnection connection = null;
           
            try
            {
                URL url = new URL(params[0]);
                CLog.d(params[0]);
               
                connection = (HttpURLConnection)url.openConnection();
                connection.setDoInput(true);
                connection.connect();
                InputStream input = connection.getInputStream();
                Bitmap myBitmap = BitmapFactory.decodeStream(input);
               
                return myBitmap;
               
            }catch(IOException e)
            {
                CLog.d("이미지 다운로드 에러 = "+e);
           
            }finally{
                if(connection!=null)
                    connection.disconnect();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Bitmap result) {
           
            String folder_path = Environment.getExternalStorageDirectory()+"/Photo";
            Bitmap photo = result;
           
            File file_path;
           
            try{
                file_path = new File(folder_path);
                if(!file_path.isDirectory())
                    file_path.mkdirs();
               
                FileOutputStream out = new FileOutputStream(in_photo_url);
                CLog.d(in_photo_url);
               
                photo.compress(Bitmap.CompressFormat.JPEG, 100, out);
                out.close();
                CLog.d("파일저장 성공");
            }catch(Exception e){
                CLog.e("파일 다운로드 실패 = "+ e.toString());
            }
           
            super.onPostExecute(result);
        }   
    }*/

일단 이렇게 사용하고 있습니다.
0 추천

FileOutputStream out = new FileOutputStream(in_photo_url);

이부분 in_photo_url 가 뭔지 모르겠네요.

그리고 제가 알기로 3.0 이후부터 AsyncTask는 직렬작업이 기본입니다.

병렬로 하시려면  executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

이렇게 호출하셔야 합니다.

이왕이면 AsyncTask 생성할 때 ImageView를 넘겨주시고 파일로 쓰지말고 

onPostExecute 에서 바로 이미지 설정하시길 권장드립니다.

 

코딩인헬 (12,150 포인트) 님이 2015년 5월 13일 답변
in_photo_url은 사진이 저장될 곳입니다.
그리고 병렬로도 해보았지만 직렬이랑 결과는 도찐개찐이네요 ㅜㅜ

일단은 aquery image로 표시는 했지만..
다운 받아 작업하는게 목표라(다른곳에도 쓸예정이라서요)
...