在大量使用 honeycomb 之后,事实证明,如果您执行任何 HTTP 操作,它都会检测到 NetworkOnMainThread 问题。我通过将对 http 的调用放在一个单独的 AsynTask 中来处理这个问题,这似乎运作良好......
现在我正在尝试加载一个正在获取的 WMS 层(通过 https)并将其放在 map 上。这工作正常,但我使用 AsyncTask 的方式并没有削减它,因为每次在叠加层上调用绘制时(我认为是每次移动 map 时)它都在做另一件事
new getWmsAsync().execute();
这意味着一段时间后有最大线程数。
我不确定正确的解决方法是什么。或者在按照我知道自己失败的方式完成后如何以正确的方式设计它。我错过了什么?是否可以在不同的线程上获取 https 请求(我认为每次移动 map 时都必须这样做)。
原始调用:
在 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()
使用这种方式,我最终会遇到此错误:
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]
最佳答案
After playing with honeycomb a lot, it turns out if you do any HTTP stuff it wines about a NetworkOnMainThread issue.
据我所知,只有在使用 StrictMode
时才会收到消息。无论如何,比 LogCat 消息更重要的是,如果您在主应用程序线程上执行网络 I/O,您将卡住您的 UI。
I am not sure what the right fix for this is.
嗯,通常情况下,您会缓存 HTTP 请求结果,因此您不需要重新请求它们。
或者,如果您的每个请求都针对不同的数据,请等到用户暂停,然后对最终结果执行单个请求,就像 Google map 对其自己的 map 图 block 所做的一样。
关于android - 在 Android 平板电脑的 map 上绘制叠加层时正确处理主线程连接上的网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7164623/