2017-07-27 26 views
0

我从具有较大像素大小的url下载图像。获取此位图是在AsyncTask中完成的。代码如下:在Android中获取大位图的宽度会导致NullPointerException

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); 

它给我的NullPointerException上mBitmap.getWidth()。我用其他屏幕分辨率较低的图片进行了检查,结果表明虽然有效我试图压缩位图,但失败了。 有什么建议?提前致谢。

更新:logcat的如下:

引起:显示java.lang.NullPointerException:尝试调用虚拟方法 '诠释android.graphics.Bitmap.getWidth()' 上的空对象引用

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

+0

是getWidth还是mBitmap为空? – ApriOri

+0

@ApriOri更新了问题。 – huk

+0

请告诉我们完整的代码。 –

回答

0

AsyncTask的一点是,onPostExecute它将设置的mBitmap值:

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

设置之前,您只需取它的价值,这就是为什么它是null

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

如果您execute另一个AsyncTask这并不意味着您的上一个已经完成执行。

+0

第二个代码是在另一个asynctask中编写的,它在调用asynctask的位图之后调用。所以第二个asynctask将排队,我在我的问题中提到它适用于小分辨率图像。 – huk

+0

仅仅因为它是在第一个之后执行的,并不意味着第一个任务在那时完成。当你调用'execute'时,它还没有被处理。来自AsyncTask docs的 –

+0

- “onPostExecute(Result),在后台计算完成后在UI线程上调用”。这不是说'doInBackground(Params)'完成了吗? – skeidsberget2365

相关问题