android下载图片过大导致报错

问题描述

android下载图片过大导致报错

package tarena.day2801;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;

public class MainActivity extends Activity {

private Button button;
private ImageView img;
private String image_Path = "http://2.javatl.sinaapp.com/images/51d8c1d77fed4.jpg";
private ProgressDialog dialog;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    button = (Button) findViewById(R.id.button1);
    img = (ImageView) findViewById(R.id.imageView1);
    LinearLayout rl = (LinearLayout) findViewById(R.id.lr);

    ImageView img = new ImageView(this);
    DisplayMetrics dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);
    int height = dm.heightPixels/3;
    int width = dm.widthPixels / 2;
    LayoutParams params = new LayoutParams(width, height);
    img.setLayoutParams(params);
    rl.setGravity(Gravity.CENTER);
    img.setImageResource(R.drawable.ic_launcher);

    dialog = new ProgressDialog(this);
    dialog.setTitle("提示信息");
    dialog.setMessage("正在下载,请稍候...");
    button.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            new MYTask().execute(image_Path);
        }
    });
}

/**
 * 使用异步任务的规则: 1、申明的类继承AsyncTask 标注三个参数的类型
 * 2、第一个参数表示要执行的任务,通常是网络的路径;第二个参数表示进度的刻度,第三个参数表示任务执行的返回结果
 *
 * @author liende
 *
 */
public class MYTask extends AsyncTask<String, Void, Bitmap> {
    /**
     * 表示任务执行之前的操作
     */
    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        dialog.show();
    }

    /**
     * 主要是完成耗时的操作
     */
    @Override
    protected Bitmap doInBackground(String... arg0) {
        // TODO Auto-generated method stub
        // 使用网络连接类HttpClient类王城对网络数据的提取
        HttpClient httpClient = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet(arg0[0]);
        Bitmap bitmap = null;
        try {
            HttpResponse httpResponse = httpClient.execute(httpGet);
            if (httpResponse.getStatusLine().getStatusCode() == 200) {
                HttpEntity httpEntity = httpResponse.getEntity();
                byte[] data = EntityUtils.toByteArray(httpEntity);
                bitmap = BitmapFactory
                        .decodeByteArray(data, 0, data.length);

//在这里调用压缩方法

                                    bitmap = compressImage(bitmap);
            }
        } catch (Exception e) {
            // TODO: handle exception
        }

        return bitmap;

    }

    /**
     * 主要是更新UI的操作
     */
    @Override
    protected void onPostExecute(Bitmap bitmap) {
        // TODO Auto-generated method stub

        super.onPostExecute(bitmap);
         Bitmap bmcopy = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());
            Paint paint = new Paint();
            Canvas canvas = new Canvas(bmcopy);
            Matrix mt = new Matrix();
            mt.setRotate(30, bmcopy.getWidth()/2, bmcopy.getHeight()/2);
            //mt.setScale(0.5f, 2);
            canvas.drawBitmap(bitmap, mt, paint);           

        img.setImageBitmap(bmcopy);
        dialog.dismiss();
    }

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

** //图片压缩方法**

 private Bitmap compressImage(Bitmap image) {

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
    int options = 100;
    while ( baos.toByteArray().length / 1024>100) {    //循环判断如果压缩后图片是否大于100kb,大于继续压缩
        baos.reset();//重置baos即清空baos
        image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中
        options -= 10;//每次都减少10

    }
    ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中
    Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片
    return bitmap;
}

}

明明调用了图片压缩方法,但是不知道为什么运行的时候还是崩溃

解决方案

你那个压缩循环有问题,压缩已经压缩过的东西基本没有效果的。所以,如果你第一次JPEG压缩不能达到100kb一下的话,那么这个while基本就是个死循环。

解决方案二:

推荐使用Universal-ImageLoader.

时间: 2024-10-26 05:32:02

android下载图片过大导致报错的相关文章

suse linux java ftp上传文件名称导致报错,求大神指导

问题描述 suse linux java ftp上传文件名称导致报错,求大神指导 上传时"school_user.questionext.csv"就因为文件名称多了一个"."导致报错 553 Could not create file.

图片下载 图片缓存-android下载图片保存到本地图片大小为0KB,是什么原因??求大神解决

问题描述 android下载图片保存到本地图片大小为0KB,是什么原因??求大神解决 public Drawable loadImageFromUrl(String urlPath, String directory, String filename) { byte[] data = null; InputStream is = null; Drawable drawable = null; HttpURLConnection conn = null; URL url = null; try {

图片-android控件自定义属性为什么引用报错呢

问题描述 android控件自定义属性为什么引用报错呢 解决方案 改成xmlns:tvtext=""http://schemas.android.com/apk/res-auto"",如果这样也不行,那就是attrs那里定义有问题 解决方案二: http://blog.csdn.net/lmj623565791/article/details/45022631 解决方案三: 检查attrs写了没 解决方案四: Android 自定义控件与属性Android自定义控件

tomcat集群-nginx 反向代理三个本地tomcat 负载均衡配置 无法加载js css 图片等 也不报错

问题描述 nginx 反向代理三个本地tomcat 负载均衡配置 无法加载js css 图片等 也不报错 打开速度非常慢,到最后js css无法加载是什么问题 我的项目是ssh+jquery+easyui的 单独访问tomcat完全正常 访问nginx就这样了 .求大神指点啊 访问webapp根目录是可以的 我的页面都是在web-inf目录下的貌似不行 nginx配置如下: #user nobody; worker_processes 1; #error_log logs/error.log;

android studio 1.5创建项目报错

问题描述 android studio 1.5创建项目报错 错误:A problem occurred configuring project ':app'. Could not download junit.jar (junit:junit:4.12) Could not get resource 'https://jcenter.bintray.com/junit/junit/4.12/junit-4.12.jar'. > Could not GET 'https://jcenter.bin

ndk android-Opencv for android 3.0库工程导入报错

问题描述 Opencv for android 3.0库工程导入报错 工程和包名上显示红叉,打开类并没错!求路过的大神指点! 之前用的ADT,今天下了个opencv的sdk,然后又下了CDT的插件和NDK,之前也没玩过ndk.配好了之后看网上说明导入了Opencv Library3.0的工程,然后就是这种错,工程properties设置了ndk的变量,Android tools生成了jni,我还漏掉了哪里,或者有什么注意的地方特比注意的,有大神能指导下吗!? 解决方案 Eclipse for J

java-字节流复制图片的问题,报错,复制失败,图片损坏而且为0 kb

问题描述 字节流复制图片的问题,报错,复制失败,图片损坏而且为0 kb import java.io.*; class Lee{ public static void main (String[] args){ FileOutputStream fos=null; FileInputStream fis=null; try{ fos=new FileOutputStream("D:毕向东视频9.png"); fis=new FileInputStream("D:毕向东视频99

web服务-app 调用webservice的图片上传接口报错

问题描述 app 调用webservice的图片上传接口报错 以下为c#写的图片上传接口,图片是在app转为base64的:而当在服务上测试时是可以上传,即下图的位置 可是在app调用该接口时却出错,这是为什么,困扰了多天了.请大神帮忙哈 public JObject UploadPicture(string jsonString) { JToken Picture; JObject jobject = JObject.Parse(jsonString); Picture = jobject.G

x86没有jni.so导致报错

问题描述 android虚拟机用的是x86架构吧,然后没有x86架构的jni.so文件导致报错java.lang.UnsatisfiedLinkError: com.easemob.media.EIce.请问x86有jni.so吗? 解决方案 Eice错误不是X86导致的,看下是否jar包和so库版本不匹配,或者有v7a文件夹没有复制so库,复制armeabi里的