簡體   English   中英

從asyncTask返回的值的NullPoint異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM