[英]NullPoint exception on value returned from asyncTask
我不明白為什么位圖為空。 我已經測試了從doInbackGround()
返回的值,該值不為null,並且onPostExecute()
方法也不為null。 AsyncTask在使用bitMap之前執行,但是該值始終為null。
我的AsyncTask:
public class ImageTask extends AsyncTask<Void, Void, Bitmap> {
private Display display;
public ImageTask(Display display) {
this.display = display;
}
@Override
protected Bitmap doInBackground(Void... params) {
Bitmap overlay;
try {
URL url = new URL(...);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
overlay = BitmapFactory.decodeStream(input);
connection.disconnect();
} catch (IOException e) {
e.printStackTrace();
return null;
}
return overlay;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
if (bitmap != null)
display.setBitmap(bitmap);
}
}
我在這里在類Display中啟動AsyncTask:
public class Display{
private Bitmap bitmap;
...
public void setBitmap(Bitmap bitmap) {
this.bitmap = bitmap;
}
public void func(){
....
new ImageTask(this).execute();
canvas.drawBitmap(bitmap, 25, 25, null); -> bitmap is null here !?!?!
....
}
我的logcat:
08-25 10:19:00.757: E/AndroidRuntime(4322): FATAL EXCEPTION: main
08-25 10:19:00.757: E/AndroidRuntime(4322): java.lang.NullPointerException
08-25 10:19:00.757: E/AndroidRuntime(4322): at android.graphics.Canvas.throwIfRecycled(Canvas.java:1025)
08-25 10:19:00.757: E/AndroidRuntime(4322): at android.graphics.Canvas.drawBitmap(Canvas.java:1065)
08-25 10:19:00.757: E/AndroidRuntime(4322): at com.graphic.core.Display.addMarker(Display.java:51)
現在我有一個疑問,當我執行asyncTask.execute()
,將執行此指令下的行? 還是僅在asyncTask完成后才執行這些行? 我認為行是在onPostExecute()
之后執行的,但我會對此進行澄清。
提前致謝。
AsyncTask與UI線程並行運行,因此canvas.drawBitmap(bitmap, 25, 25, null);
在下載圖像時調用。 由於尚未設置圖像,因此您將獲得NullPointerException
。
嘗試將canvas.drawBitmap(bitmap, 25, 25, null);
在setBitmap(Bitmap);
而不是在func();
移動此canvas.drawBitmap(bitmap, 25, 25, null);
在onPostExecute()
內部。
AsyncTask在不同的線程中運行。 因此,無需等待AsyncTask的結果即可執行這些行。
canvas.drawBitmap
和您的AsyncTask並行運行。 因此,即使在AsyncTask完成之前也會進行繪制。 將您的canvas.drawBitmap
移到setBitmap()
asyncTask.execute()
啟動異步操作。 這意味着AsyncTask
的代碼將與您的同步代碼並行運行。 因此, asyncTask.execute()
之后的所有代碼都將在AsyncTask
的代碼之前或與其並行運行。 所以這段代碼:
new ImageTask(this).execute();
canvas.drawBitmap(bitmap, 25, 25, null);
不管用。 第一行開始AsyncTask
,之后立即嘗試繪制Bitmap
。 您要做的是在onPostExecute()
返回Bitmap
。 當然,您已經使用setBitmap()
方法進行了此操作,但是缺少的是僅在調用setBitmap()
之后 setBitmap()
應嘗試繪制它。
調用時位圖為null是正常的
canvas.drawBitmap(bitmap, 25, 25, null)
因為您沒有等待異步任務返回結果 。 您應該在onPostExecute中調用drawBitmap,並且可能在視圖上調用invalidate()以強制其重繪
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.