SD-карта не работает? - PullRequest
       5

SD-карта не работает?

0 голосов
/ 02 октября 2010

Может кто-нибудь сказать мне, где я ошибаюсь с этим куском кода?По сути, я хочу, чтобы приложение загружало файл .png, отображало его для пользователя, а также сохраняло его на SD-карту для дальнейшего использования.Кажется, все идет хорошо до части while ((len = webstream.read(buffer)) > 0);поскольку отладчик не достигает точки останова, которую я здесь поставил, и у меня есть каталог пустых файлов .png.У меня есть разрешение WRITE_EXTERNAL_STORAGE, заявленное в моем манифесте.

protected class DownloadTask extends AsyncTask<String, Integer, Bitmap> {

    @Override
    protected Bitmap doInBackground(String... string) {

        Bitmap d = null;

        try {

            DefaultHttpClient dhc = new DefaultHttpClient();
            HttpGet request = new HttpGet(HTTP_BASE + string[0] + ".png");
            HttpResponse response = dhc.execute(request);
            BufferedInputStream webstream = new BufferedInputStream(response.getEntity().getContent());
            d = BitmapFactory.decodeStream(webstream);
            writeToSd(string[0], webstream, d);

        }
        catch (Exception ex) { ex.printStackTrace(); }

        return d;

    }

    private void writeToSd(String string, BufferedInputStream webstream, Bitmap d) {

        try {

            webstream.mark(3);
            webstream.reset();
            File f = new File(Environment.getExternalStorageDirectory() + SD_DIR);
            f.mkdirs();
            File f2 = new File(f, string + ".png");
            f2.createNewFile();
            BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream(f2));

            int len;
            byte[] buffer = new byte[1024];
            while ((len = webstream.read(buffer)) > 0) {

                fos.write(buffer, 0, len);

            }

            webstream.close();
            //fos.flush();
            fos.close();

        }
        catch (Exception ex) {

            ex.printStackTrace();

        }


    }

    protected void onPostExecute(Bitmap result) {

        if (result != null) {
            iv.setImageBitmap(result);
            vs.setDisplayedChild(1);
        }

    }

};

Ответы [ 2 ]

1 голос
/ 02 октября 2010

Если вам не нужны исходные байты потока, вы можете записать растровое изображение на диск, используя Bitmap.compress(format, quality, stream).

Однако ответ Хэми, вероятно, является лучшим с точки зрения сохранения памяти.

1 голос
/ 02 октября 2010

Я точно не знаю, но, похоже, что-то не так с перечитыванием InputStream, даже если оно буферизовано.Изображение - это довольно много данных для хранения в памяти.Вместо того, чтобы

Получить изображение, отобразить изображение, сохранить изображение

вы можете попробовать

Получить изображение, сохранить изображение, отобразить изображение

Таким образом, вы можете записать полноразмерное изображение на диск (без необходимости буферизовать поток и потреблять много памяти).Затем вы можете просто загрузить изображение с SD-карты с самой низкой частотой дискретизации, которая подходит для вашего приложения, тем самым сохраняя полноразмерное изображение в памяти.Кроме того, выполнение этого способа, вероятно, устранит любые проблемы, которые вы можете иметь или не иметь с bufferedInputStream - я считаю, что они довольно привередливы.

...