代码之家  ›  专栏  ›  技术社区  ›  Yokupoku Maioku

从asyncTask返回的值出现NullPoint异常

  •  0
  • Yokupoku Maioku  · 技术社区  · 10 年前

    我不明白为什么位图为空。我已经测试了从 doInbackGround() 并且它不为空,也不为空 onPostExecute() 方法 AsyncTask在使用bitMap之前执行,但该值始终为空。

    我的异步任务:

    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 !?!?!
              ....   
    }
    

    我的日志:

    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() 但我想澄清一下。

    提前感谢。

    5 回复  |  直到 10 年前
        1
  •  0
  •   Xaver Kapeller    10 年前

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

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

    不会起作用。第一行开始 异步任务 然后立即尝试绘制 Bitmap 。您需要做的是将 位图 在里面 onPostExecute() 。当然,您已经在使用 setBitmap() 方法,但缺少的是 之后 使命感 setBitmap() 你应该试着画出来。

        2
  •  0
  •   Pphoenix    10 年前

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

    试着放 canvas.drawBitmap(位图,25,25,null); 在里面 setBitmap(Bitmap); 而不是在 func();

        3
  •  0
  •   Aniruddha    10 年前

    移动此 canvas.drawBitmap(bitmap, 25, 25, null); 在…内 onPostExecute() .

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

        4
  •  0
  •   sinujohn    10 年前

    canvas.drawBitmap 和AsyncTask并行运行。因此,绘制甚至在AsyncTask完成之前发生。移动您的 canvas.drawBitmap setBitmap()

        5
  •  0
  •   Alaa Eddine Cherbib    10 年前

    调用时位图为空是正常的

    canvas.drawBitmap(bitmap, 25, 25, null)
    

    因为 您没有等待异步任务返回结果 .您应该在中调用drawBitmap 在执行后 可能会打电话 使无效() 在视图上强制重新绘制