2013-03-07 6 views
1

내 애플리케이션이 JSON에서 이미지 이름을 가져옵니다. 그 이름을 다른 URL로 연결하여 이미지를 다운로드했습니다. 모든 이미지를 다운로드 할 수 있지만 다운로드 한 이미지는 모두 동일합니다. 예를 들어, 내 이미지 이름 (1,2,3,4,5,6,7) 그러나 다운로드 할 때, 나는 그것을 모두 얻을 수 있지만 모두 (1,1,1,1,1,1,1)입니다.여러 이미지 다운로드 - 모든 이미지를 다운로드 할 수 있지만 이미지는 모두 동일합니다.

DownloadImageTask 로그 문자열 namereviewImageLink을 가졌습니다. 결과는 좋았다. 그것은 다른 이름과 URL을 보여줍니다. BUT

DownloadFullImageTask (onPostExcecute) 또한 로그 문자열은 name이지만 동일한 이름 (1,1,1,1,1,1,1)을 표시합니다.

내 이미지를 모두 다운로드하고 동일하지는 않습니다. 어떻게해야합니까?

JSON

{"pictures": [ 
{ 
    "picture_url": "2de19d49ecc640e94b1a306944e161ef.png" 
}, 
{ 
    "picture_url": "bee57cbb42c364592e7472b442c58868.jpg" 
}, 
{ 
    "picture_url": "b718041660189162080ff86b09370ec8.jpg" 
}, 
{ 
    "picture_url": "7022dec80bb604bcbba51d28ce8bc31c.jpg" 
}, 
{ 
    "picture_url": "0be79b2cd531adf02487e8d54f736c0f.jpg" 
}, 
{ 
    "picture_url": "2101134bcfc1356df1ff187a8f9510f8.jpg" 
}, 
{ 
    "picture_url": "2de62e026b3378bbbdfe687cd43d5b0e.jpg" 
}]} 

AsyncTask를 다운로드 이미지와 JSON은

public class DownloadImageTask extends AsyncTask<String, Void, Void> { 

@Override 
protected Void doInBackground(String... params) { 

    placeList = new ArrayList<HashMap<String, String>>(); 
    JSONParser jParser = new JSONParser(); 
    JSONObject jsonO = jParser.getJSONUrl(url); 

     // for " piture " Object in json 
     pictures = jsonO.getJSONArray("pictures"); 
     for (int i = 0; i < pictures.length(); i++) { 
      JSONObject jObj = pictures.getJSONObject(i); 
      int cafe_id = jObj.getInt(TAG_CAFE_ID); 
      String picture_url = jObj.getString(TAG_PICTURE_URL); 

      // Table Picture 
      Model_Insert model_Insert = new Model_Insert(); 
      model_Insert.setCafe_Id(cafe_id); 
      model_Insert.setPitureUrl(picture_url); 
      model_Insert = dataSource.createTablePicture(model_Insert); 
      Log.i("pic", " Picture " + model_Insert.getPitureurl()); 
      HashMap<String, String> map = new HashMap<String, String>(); 
      map.put(TAG_PICTURE_URL, picture_url); 
      placeList.add(map); 

      // Execute DownloadFullImageTask 
      reviewImageLink = "http://xxx.xxx/xxx/place_pictures/"+picture_url; 
      URL reviewImageURL; 
      Log.i("url", reviewImageLink); 
      String name = reviewImageLink.substring(reviewImageLink.lastIndexOf("/") + 1); 
      try { 
       reviewImageURL = new URL(reviewImageLink); 
       if (!hasExternalStoragePublicPicture(name)) { 
        isImage = false; 
        new DownloadFullImageTask().execute(reviewImageURL); 
        Log.v("log_tag", "if"); 
        isImage = true; 
        File sdImageMainDirectory = new File(Environment.getExternalStorageDirectory(),getResources() 
            .getString(R.string.directory)); 
        sdImageMainDirectory.mkdirs(); 
        File file = new File(sdImageMainDirectory, name); 
        Log.v("log_tag", "Directory created"); 
       } 

      } catch (MalformedURLException e) { 
       Log.v(TAG, e.toString()); 
      } 
     } 

    } catch (JSONException e) { 
     // TODO: handle exception 
    } 
    return null; 
} 

protected void onPostExecute(Void unused) { 
    ShowAllContent(); // When Finish Show Content 
} 

}

AsyncTask를 당신의 onPostExecute에서 URL을

public class DownloadFullImageTask extends AsyncTask<URL, Integer, Bitmap> { 

protected Bitmap doInBackground(URL... paths) { 
    URL url; 
    try { 
     url = paths[0]; 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     int length = connection.getContentLength(); 
     InputStream is = (InputStream) url.getContent(); 
     byte[] imageData = new byte[length]; 
     int buffersize = (int) Math.ceil(length/(double) 100); 
     int downloaded = 0; 
     int read; 
     while (downloaded < length) { 
      if (length < buffersize) { 
       read = is.read(imageData, downloaded, length); 
      } else if ((length - downloaded) <= buffersize) { 
       read = is.read(imageData, downloaded, length - downloaded); 
      } else { 
       read = is.read(imageData, downloaded, buffersize); 
      } 
      downloaded += read; 
      publishProgress((downloaded * 100)/length); 
     } 
     Bitmap bitmap = BitmapFactory.decodeByteArray(imageData, 0, 
       length); 
     if (bitmap != null) { 
      Log.i(TAG, "Bitmap created"); 
     } else { 
      Log.i(TAG, "Bitmap not created"); 
     } 
     is.close(); 
     return bitmap; 
    } catch (MalformedURLException e) { 
     Log.e(TAG, "Malformed exception: " + e.toString()); 
    } catch (IOException e) { 
     Log.e(TAG, "IOException: " + e.toString()); 
    } catch (Exception e) { 
     Log.e(TAG, "Exception: " + e.toString()); 
    } 
    return null; 
} 

protected void onPostExecute(Bitmap result) { 
    String name = reviewImageLink.substring(reviewImageLink.lastIndexOf("/") + 1); 
    if (result != null) { 
     hasExternalStoragePublicPicture(name); 
     saveToSDCard(result, name); 
     isImage = true; 

    } else { 
     isImage = false; 
    } 
} 
} 
+0

첫 번째 제안이 잘못되었습니다. 죄송합니다. 귀하의 오류가 마지막 부분에 있어야한다고 생각합니다 : saveToSDCard (result, name); 몇 가지 샘플 코드를 제공 할 수 있습니까? – Warpzit

+0

여기 http://pastie.org/6408872 – kongkea

+0

에 대한 자세한 정보를 제공 할 수 있습니다. postexecute에서 DownloadFullImageTask인가요, 아니면 전에 발생합니까? 내 제안은 지금 public 변수 reviewImageLink가 그 두 개의 asynctask보다 다른 곳으로 변경되었다는 것입니다 ... – Warpzit

답변

1

을 실행공용 필드는 reviewImageLink입니다. 그러나이 필드는 다른 작업에 의해 변경됩니다. 이 문제를 해결하려면 doInBackground에서 경로 [0]을 저장하고 대신이 경로를 사용하는 DownloadFullImageTask에 내부 변수를 넣는 것이 좋습니다.

1

멀티 스레드로드, 메모리 캐시 또는 외부 캐시의 성능을 향상 시키려면 다음을 수행하십시오. 나는 당신이 도서관에서 살펴 보시기 바랍니다

https://github.com/nostra13/Android-Universal-Image-Loader

이 강력하다!

+1

고려해야 할 또 다른 도서관 : [Picasso] (http://square.github.io/picasso). 매우 강력하고 사용하기가 매우 쉽습니다. –

+0

그들을 사용하여 이미지를 sdcard로 다운로드하는 방법. 그들은 단지 이미지를 보여줍니다. 임시 폴더에 넣으십시오. 나는 피카소를 사용하고있다. – shailesh

+0

정확하게 나는 단지 이미지를 다운로드하고 싶다. 약 1,000 명. 나는 그들을 보여주고 싶지 않다. 여러 이미지를 하나씩 다운로드하지 않고 동시에 다운로드하고 싶습니다. –

관련 문제