android - 在 Android 平板电脑的 map 上绘制叠加层时正确处理主线程连接上的网络

标签 android android-maps android-3.0-honeycomb wms

在大量使用 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/

相关文章:

java - 无法找到 Android Studio Flamingo 的嵌入式 java 版本和 gradle 工具版本的兼容版本

Android Studio 4.0 布局检查器不工作

Android:在谷歌地图中设置缩放级别以包括所有标记点

Android Fragments 和后退按钮问题

android - 无法更新 Xamarin.Forms

android - map View 的半径

android - 使用 Google Maps API for Android 搜索位置

android - 带有加载器框架的 MapActivity

android - 在不对 subview 进行动画处理的情况下对 ViewGroup 进行动画处理

android - 无法单击自定义操作 View