カスタムオーバーレイを持つGoogleマップのmapViewがあります。このオーバーレイは、ユーザーが見ている現在の座標を取得し、Web サイトに移動して、マップ上にオーバーレイする画像を取得します。Web リクエストには数秒かかり、UI スレッドが完全にロックされる可能性があるため、これは悪い習慣です。その問題を修正しようとしています。
画像を取得し、準備ができたらマップに描画する AsyncTask を使用して修正しようとしています。Canvas を AsyncTask に渡して、準備ができたときに描画が行われるようにしようとしていますが、描画が行われず、描画時にキャンバスのサイズが 0x0 であることがわかります。
AsyncTask に入れようとする前に、すべての描画コードが機能していましたが、それが遅かっただけです。
これはすべて私のカスタム オーバーレイにあります。
public class MapOverlaySevereWeather extends com.google.android.maps.Overlay
{
private GeoPoint lastTopLeft = new GeoPoint(0, 0);
private GeoPoint lastBotRight = new GeoPoint(0, 0);
private Bitmap mapImage;
private Canvas thisCanvas;
private MapView mMapView;
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow)
{
super.draw(canvas, mapView, shadow);
if( shadow || MapOverlayHandler.isInMotion() )
{ return; }
mMapView = mapView;
thisCanvas = canvas;
Rect curShown = canvas.getClipBounds();
GeoPoint topLeft = mapView.getProjection().fromPixels(0,0);
GeoPoint bottomRight = mapView.getProjection().fromPixels(curShown.right, curShown.bottom);
if( !topLeft.equals(lastTopLeft) || !bottomRight.equals(lastBotRight) )
{
int sizeX = mapView.getWidth();//curShown.right - curShown.left;
int sizeY = mapView.getHeight();////curShown.bottom - curShown.top;
float minLat = (float)bottomRight.getLatitudeE6() / 1E6f;
float minLon = (float)topLeft.getLongitudeE6() / 1E6f;
float maxLat = (float)topLeft.getLatitudeE6() / 1E6f;
float maxLon = (float)bottomRight.getLongitudeE6() / 1E6f;
String fileUrl = "url that gets image based off lat long size";
new SevereWeatherAsync().execute(new AsyncOverlayData(fileUrl, canvas, curShown));
}
lastTopLeft = topLeft;
lastBotRight = bottomRight;
return;
}
private class SevereWeatherAsync extends AsyncTask<AsyncOverlayData, Void, AsyncOverlayData>
{
@Override
protected void onPostExecute(AsyncOverlayData result)
{
super.onPostExecute(result);
Log.w("Severe","Drawing on " + thisCanvas.getHeight() + " x " + thisCanvas.getWidth());
Paint paint = new Paint();
paint.setAlpha(100);
thisCanvas.drawBitmap(mapImage, null, result.getCurRect(), paint);
mMapView.invalidate();
}
@Override
protected AsyncOverlayData doInBackground(AsyncOverlayData... params)
{
Log.w("Severe","getting image");
URL imageFileURL = null;
try
{
imageFileURL = new URL(params[0].getURL());
HttpURLConnection conn = (HttpURLConnection) imageFileURL.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream is = conn.getInputStream();
mapImage = BitmapFactory.decodeStream(is);
}
catch(Exception e)
{ return null; }
return params[0];
}
}
}