android - 解码流返回 0 值?

标签 android android-bitmap bitmapfactory

我正在尝试下载一个图像,然后将其显示到我的 imageView 组件。

要下载,我必须使用 Asyntask 并显示进度条来通知用户。问题是在通过循环获取计算的进度值后,我从 inputStream 获得了 0。

   Log.d("is", "" + inputStream.available()); // ---> will have a value

            byte[] buffer = new byte[contentLenght];
            while ((read = inputStream.read(buffer)) != -1) {

                counter += read;
                publishProgress(counter);

                outputStream.write(buffer,0,read);
            }
            Log.d("is", "" + inputStream.available()); // -----> will return 0
            bmp = BitmapFactory.decodeStream(inputStream); // bmp will be empty

有没有办法获取进度条的计算值,而不是在输入流的末尾获取 0 值?

我在这里使用 Asyntask。

澄清

bmp 将有一个值,当我这样做时 imageView.setImageBitmap(bmp); 它会工作 只有当 我删除循环并调用 bmp = BitmapFactory.decodeStream(inputStream);

但是如果我在执行此操作之前放一个循环

bmp = BitmapFactory.decodeStream(inputStream);

imageView 将不显示任何内容

这是我的完整异步任务代码,包括网络连接

   int progressCounter;
        int contentLenght;
        int counter;
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progressBar.setVisibility(View.VISIBLE);

        }

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

            return ConnectToInternet(params[0]);
        }

        @Override
        protected void onPostExecute(Boolean aVoid) {
            //Log.d("buff",bmp.toString());
            progressBar.setVisibility(View.GONE);
            imageView.setImageBitmap(bmp);
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            progressCounter =(int) (((double) values[0] / contentLenght) * 100);
            progressBar.setProgress(progressCounter);
        }

        boolean ConnectToInternet(String url){
            boolean sucessfull = false;
            URL downloadURL = null;
            HttpURLConnection connection = null;
            InputStream inputStream = null;


            try {

                downloadURL = new URL(url);
                connection = (HttpURLConnection) downloadURL.openConnection();
                inputStream = connection.getInputStream();
                contentLenght = connection.getContentLength();
                Log.d("is", "" + inputStream.available());

                int read = -1;
                byte[] buffer = new byte[contentLenght];
                while ((read = inputStream.read(buffer)) != -1) {

                    counter += read;
                    publishProgress(counter);


                }
                Log.d("is", "" + inputStream.available());
                bmp = BitmapFactory.decodeStream(inputStream);

                sucessfull = true;

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                connection.disconnect();
                try {

                    inputStream.close();

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return  sucessfull;
        }

谢谢

最佳答案

while语句正在消耗 inputStream完全,因此在 BitmapFactory.decodeStream(inputStream) 中没有任何内容可用于解码.

试试这个:

boolean ConnectToInternet(String url){

    // ...

    int read;

    // contentLength may be too big,
    // so read stream in smaller chunks.
    //
    // there's a typo in contentLenght :)
    byte[] buffer = new byte[4096];

    // Object for storing partially downloaded image.
    ByteArrayOutputStream imageBaos = new ByteArrayOutputStream();

    // Initialize counter.
    counter = 0;

    while ((read = inputStream.read(buffer)) != -1) {

        counter += read;
        publishProgress(counter);

        // Store downloaded chunk.
        imageBaos.write(buffer, 0, read);
    }

    // Obtain bitmap from downloaded chunks.
    bmp = BitmapFactory.decodeByteArray(imageBaos.toByteArray(), 0, imageBaos.size());

    // ...

}

关于android - 解码流返回 0 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41543028/

相关文章:

android - 如何保持我的应用程序服务继续运行,即使应用程序从 MI 手机中的任务管理器关闭

java - 我的位图在缩放后在 Android 中旋转

android - Android OpenCV 中传出字节 [] 需要 cv::imencode 吗?

Android:我想录制可能的超低质量视频源并以离散数据包发送。可能吗?你会如何处理它?

Android Picasso 将图像加载到 Bitmap 变量并将其裁剪为正方形

android - 使用LinearLayout将按钮放在屏幕底部?

Android phonegap 应用程序 : open link from browser into app

android - 无法对具有不同高度和宽度的位图进行样式化

android - 缩放图像在背景可绘制中保持其纵横比

Android O - 关闭通知 channel 然后打开,重要性级别始终重置为中等