Android大图像下载问题:内存不足

Android大图像下载问题:内存不足,android,image,download,out-of-memory,Android,Image,Download,Out Of Memory,我正在尝试下载一个图像文件。在某些情况下,图像太大,中途会发出OfMemoryError。如何处理这种情况 private class DownloadImage extends AsyncTask<String, Void, Bitmap> { @Override protected void onPreExecute() { super.onPreExecute();

我正在尝试下载一个图像文件。在某些情况下,图像太大,中途会发出OfMemoryError。如何处理这种情况

private class DownloadImage extends AsyncTask<String, Void, Bitmap> {

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                mProgressDialog = new ProgressDialog(MainActivity.this);
                mProgressDialog.setTitle("Download Image");
                mProgressDialog.setMessage("Loading...");
                mProgressDialog.setIndeterminate(false);
                mProgressDialog.show();
            }

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

                String imageURL = URL[0];

                Bitmap bitmap = null;
                try {
                    // Download Image from URL
                    InputStream input = new java.net.URL(imageURL).openStream();
                    // Decode Bitmap
                    bitmap = BitmapFactory.decodeStream(input);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return bitmap;
            }

            @Override
            protected void onPostExecute(Bitmap result) {
                // Set the bitmap into ImageView
                image.setImageBitmap(result);
                // Close progressdialog
                mProgressDialog.dismiss();
            }
        }
私有类下载映像扩展异步任务{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
mProgressDialog=新建ProgressDialog(MainActivity.this);
setTitle(“下载图像”);
设置消息(“加载…”);
mProgressDialog.setUndeterminate(false);
mProgressDialog.show();
}
@凌驾
受保护位图doInBackground(字符串…URL){
字符串imageURL=URL[0];
位图=空;
试一试{
//从URL下载图像
InputStream输入=新的java.net.URL(imageURL.openStream();
//解码位图
位图=BitmapFactory.decodeStream(输入);
}捕获(例外e){
e、 printStackTrace();
}
返回位图;
}
@凌驾
受保护的void onPostExecute(位图结果){
//将位图设置为ImageView
image.setImageBitmap(结果);
//关闭进程对话框
mProgressDialog.disclose();
}
}

首先,您需要确定需要在哪个屏幕或屏幕部分显示它。您需要定义容器的结果大小(宽度和高度),以便在应用程序中显示您的图像。然后,当你收到你的图像时,你需要把它缩小到目标大小,然后才显示出来

这里有一大堆如何做的教程


但我建议您使用一个“加载图像”库毕加索就是一个很好的例子。请查看它

首先,您需要确定需要在哪个屏幕或屏幕部分显示它。您需要定义容器的结果大小(宽度和高度),以便在应用程序中显示您的图像。然后,当你收到你的图像时,你需要把它缩小到目标大小,然后才显示出来

这里有一大堆如何做的教程


但我建议您使用一个“加载图像”库毕加索就是一个很好的例子。如果您不想使用像毕加索这样的库,请查看,您可以使用
Volley

去搜索
NetworkImageView
,也许它会帮助你。这里有一个教程:

你也可以看看这个问题:


这里也是:

如果你不想使用像毕加索这样的库,你可以使用
Volley

去搜索
NetworkImageView
,也许它会帮助你。这里有一个教程:

你也可以看看这个问题:

这里也是:

在清单文件的应用程序标记中添加“android:largeHeap=true”

在清单文件的应用程序标记中添加“android:largeHeap=true”


你可以添加你尝试过的和logcat吗?我编辑了我的答案,也许你可以看看你可以添加你尝试过的和logcat吗?我编辑了我的答案,也许你可以看看Uppoted,但我想补充一点,如果OP出于任何原因不想使用毕加索,他/她应该通过
BufferedInputStreamReader
将URL流到一个文件中,然后使用图像的首选高度和宽度对该文件进行解码。向上投票,但我想补充一点,如果OP出于任何原因不想使用毕加索,他/她应该通过
BufferedInputStreamReader
将URL流式传输到文件,然后使用图像的首选高度和宽度对该文件进行解码。