从asyncTask返回的值的NullPoint异常

时间:2014-08-25 08:42:20

标签: java android bitmap android-asynctask

我不明白为什么位图为空。我' ve测试了从doInbackGround()返回的值,它不是null,也不是null onPostExecute()方法。 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)

现在我有一个dubt,当我执行asyncTask.execute()时,执行此指令下面的行?或者这些行只在asyncTask完成后执行? 我认为这些行是在onPostExecute()之后执行的,但我会澄清一下。

提前感谢。

5 个答案:

答案 0 :(得分:0)

AsyncTask与UI线程并行运行,因此在下载映像时会调用canvas.drawBitmap(bitmap, 25, 25, null);。由于图片尚未设置,因此您获得NullPointerException

尝试将canvas.drawBitmap(bitmap, 25, 25, null);放入setBitmap(Bitmap);而不是func();

答案 1 :(得分:0)

将此canvas.drawBitmap(bitmap, 25, 25, null);移至onPostExecute()

AsyncTask在不同的线程中运行。因此,这些行将在不等待AsyncTask的结果的情况下执行。

答案 2 :(得分:0)

canvas.drawBitmap并且您的AsyncTask并行运行。因此,即使在AsyncTask完成之前也会进行绘制。将您的canvas.drawBitmap移至setBitmap()

答案 3 :(得分:0)

asyncTask.execute()启动异步操作。这意味着AsyncTask中的代码将与您的同步代码并行运行。因此,asyncTask.execute()之后的所有代码都将在AsyncTask中的代码之前或之后运行。所以这段代码:

new ImageTask(this).execute();
canvas.drawBitmap(bitmap, 25, 25, null);

不起作用。第一行开始AsyncTask,然后立即尝试绘制Bitmap。您要做的是返回Bitmap中的onPostExecute()。当然,您已经使用setBitmap()方法执行此操作,但缺少的是只有调用setBitmap()后才应尝试绘制它。

答案 4 :(得分:0)

当你调用

时,位图为空是正常的
canvas.drawBitmap(bitmap, 25, 25, null)

因为您没有等待异步任务返回结果。你应该在 onPostExecute 中调用drawBitmap,并可能在视图上调用 invalidate()来强制重绘