在玩了很多蜂窝之后,事实证明,如果你做任何关于 NetworkOnMainThread 问题的 HTTP 事情。我通过将我对 http 的调用放在一个单独的 AsynTask 中来处理这个问题,这似乎运作良好......
现在我正在尝试加载一个正在获取的 WMS 图层(通过 https)并将其放在地图上。这工作正常,但我使用 AsyncTask 的方式并没有削减它,因为每次在叠加层上调用绘图(我认为每次移动地图时)它正在做另一个
new getWmsAsync().execute();
这意味着一段时间后有最大线程数。
我不确定对此的正确解决方法是什么。或者在按照我知道的失败方式进行操作之后,如何以正确的方式进行设计。我错过了什么?是否可以在不同的线程上获取 https 请求(我认为每次移动地图时都必须这样做)。
原来的电话:
在WMSOverlay extends Overlay
课堂上:
@Override
public void draw(Canvas canvas, MapView mapView,
boolean shadow) {
super.draw(canvas, mapView, shadow);
mCanvas=canvas;
wmsclient = new WMSLoader(mapView.getContext());
cornerCoords = MapUtils.getCornerCoordinates(mapView.getProjection(), canvas);
//new getWmsAsync().execute();
Paint semitransparent = new Paint();
semitransparent.setAlpha(0x888);
mCanvas.drawBitmap( , 0, 0, semitransparent);
}
但是我wsmClient.loadMap
有 http 调用,所以它与上面的 NetworkOnMainThread 一起死掉了。我的解决方法是:
@Override
public void draw(Canvas canvas, MapView mapView,
boolean shadow) {
super.draw(canvas, mapView, shadow);
mCanvas=canvas;
wmsclient = new WMSLoader(mapView.getContext());
cornerCoords = MapUtils.getCornerCoordinates(mapView.getProjection(), canvas);
new getWmsAsync().execute(); //too many threads here...
}
private class getWmsAsync extends AsyncTask<Void, Void, Bitmap>{
@Override
protected void onPostExecute(Bitmap image) {
Paint semitransparent = new Paint();
semitransparent.setAlpha(0x888);
mCanvas.drawBitmap(image, 0, 0, semitransparent);
this.cancel(true);
}
@Override
protected Bitmap doInBackground(Void... params) {
// TODO Auto-generated method stub
return wmsclient.loadMap(mCanvas.getWidth(), mCanvas.getHeight(), cornerCoords[0], cornerCoords[1], null);
}
}
如果我以这种方式使用.execute()
i 最终会出现此错误:
08-23 17:01:05.520: ERROR/AndroidRuntime(5436): java.util.concurrent.RejectedExecutionException: Task android.os.AsyncTask$3@41147c88 rejected from java.util.concurrent.ThreadPoolExecutor@40880c00[Running, pool size = 128, active threads = 127, queued tasks = 10, completed tasks = 59]