【问题标题】:Download multiple images - can download all images but image are all the same下载多个图像 - 可以下载所有图像但图像都相同
【发布时间】:2013-03-07 02:21:50
【问题描述】:

我的应用程序从 JSON 获取图像名称。然后我将该名称连接到另一个 url 以下载图像。我可以下载所有图像,但我下载的所有图像都是相同的。例如,我的图像名称 (1,2,3,4,5,6,7) 但是当我下载时,我可以得到它,但都是 (1,1,1,1,1,1,1)。

DownloadImageTask 我有日志字符串namereviewImageLink。结果很好。它显示不同的名称和网址。但是

DownloadFullImageTask on 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 执行地址

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);你能提供一些示例代码吗?
  • 您能否提供更多有关它何时更改其值的信息。它是在 postexecute 中的 DownloadFullImageTask 还是之前发生过?我现在的建议是公共变量 reviewImageLink 在这两个 asynctask 之外的其他地方被更改...
  • DownloadFullImageTaskonPostExecute 中,字符串name 的值是(1,1,1,1,1,1,1) 都是一样的。 pastie.org/6409454
  • 在您的 DownloadFullImageTask 的 onPostExecute 中,您使用公共字段:reviewImageLink。但是这个字段被另一个任务改变了。我建议您在 DownloadFullImageTask 中放置一个内部变量,您可以在其中保存来自 doInBackground 的路径 [0] 并改用它。试试看能不能解决问题?

标签: android json url download android-asynctask


【解决方案1】:

在您的DownloadFullImageTask 中的onPostExecute 中,您使用公共字段:reviewImageLink。但是这个字段被你的其他任务改变了。要解决此问题,我建议您在 DownloadFullImageTask 中放置一个内部变量,您可以在其中保存来自 doInBackground 的路径 [0] 并改用它。

【讨论】:

    【解决方案2】:

    通过多线程加载、内存缓存或外部缓存来获得更好的性能。 我建议你看看这个库

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

    很强大!

    【讨论】:

    • 另一个要考虑的库:Picasso。非常强大且使用非常简单。
    • 如何使用它们将图像下载到 sdcard。他们只是显示图像。并将它们放入临时文件夹中。我正在使用毕加索。
    • 正是我只想下载图像。将近一千。我不想给他们看。而且我想同时下载多张图片,不是一张一张的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 2013-03-12
    • 2021-10-22
    • 1970-01-01
    • 2016-11-23
    相关资源
    最近更新 更多