내 애플리케이션이 JSON에서 이미지 이름을 가져옵니다. 그 이름을 다른 URL로 연결하여 이미지를 다운로드했습니다. 모든 이미지를 다운로드 할 수 있지만 다운로드 한 이미지는 모두 동일합니다. 예를 들어, 내 이미지 이름 (1,2,3,4,5,6,7) 그러나 다운로드 할 때, 나는 그것을 모두 얻을 수 있지만 모두 (1,1,1,1,1,1,1)입니다.여러 이미지 다운로드 - 모든 이미지를 다운로드 할 수 있지만 이미지는 모두 동일합니다.
DownloadImageTask
로그 문자열 name
및 reviewImageLink
을 가졌습니다. 결과는 좋았다. 그것은 다른 이름과 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;
}
}
}
첫 번째 제안이 잘못되었습니다. 죄송합니다. 귀하의 오류가 마지막 부분에 있어야한다고 생각합니다 : saveToSDCard (result, name); 몇 가지 샘플 코드를 제공 할 수 있습니까? – Warpzit
여기 http://pastie.org/6408872 – kongkea
에 대한 자세한 정보를 제공 할 수 있습니다. postexecute에서 DownloadFullImageTask인가요, 아니면 전에 발생합니까? 내 제안은 지금 public 변수 reviewImageLink가 그 두 개의 asynctask보다 다른 곳으로 변경되었다는 것입니다 ... – Warpzit