我不明白为什么位图为空。我' 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:
中启动AsyncTaskpublic 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()
之后执行的,但我会澄清一下。
提前感谢。
答案 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()来强制重绘