获取大位图的宽度会在Android

时间:2017-07-27 19:14:28

标签: java android bitmap android-asynctask compression

我正在从具有较大像素大小的网址下载图片。在AsyncTask中完成此位图的获取。代码如下:

new AsyncTask<String, Void, Bitmap>() {

        public Bitmap image;

        @Override
        protected Bitmap doInBackground(String... params) {
            try {
                URLConnection conn = new URL(params[0]).openConnection();
                conn.setConnectTimeout(CONNECT_TIMEOUT);
                conn.setReadTimeout(READ_TIMEOUT);
                image = BitmapFactory.decodeStream((InputStream) conn.getContent());
                if (image == null)
                    throw new RuntimeException("Could not read image");
            } catch (Exception e) {
                e.printStackTrace();
            }
            return image;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
            mBitmap = bitmap;
        }
    }.execute(imageUrl);

现在,当我试图获得位图的宽度时如下:

Bitmap bitmap = Bitmap.createBitmap(
                    mBitmap.getWidth(), mBitmap.getHeight(),
                    Bitmap.Config.ARGB_8888);

它在mBitmap.getWidth()上给出了NullPointerException。我检查了其他具有较低屏幕分辨率的图像,虽然有效。我也尝试压缩位图,但失败了。 有什么建议??提前谢谢。

  

更新:Logcat如下:

     

引起:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'int android.graphics.Bitmap.getWidth()'

     

第二个片段用于另一个asynctask,在调用asynctask的位图后调用。

1 个答案:

答案 0 :(得分:0)

AsyncTask的要点是onPostExecute它会设置mBitmap的值:

    protected void onPostExecute(Bitmap bitmap) {
        super.onPostExecute(bitmap);
        mBitmap = bitmap; // sets this value asynchronously
    }

您只需在设置之前获取其值,这就是null的原因。

  

第二个片段用于另一个asynctask,在调用asynctask的位图之后调用。

如果你execute另一个AsyncTask,那并不代表你以前的那个已经完成了执行。