1

在玩了很多蜂窝之后,事实证明,如果你做任何关于 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]
4

1 回答 1

1

在玩了很多蜂窝之后,事实证明,如果你做任何关于 NetworkOnMainThread 问题的 HTTP 事情。

AFAIK,只有在使用StrictMode. 无论如何,比 LogCat 消息更重要的是,如果您在主应用程序线程上执行网络 I/O,则会冻结您的 UI。

我不确定对此的正确解决方法是什么。

好吧,通常情况下,您会缓存 HTTP 请求结果,因此您不需要重新请求它们。

或者,如果您的每个请求都针对不同的数据,请等到用户暂停,然后对最终结果进行一次请求,就像 Google 地图对其自己的地图图块一样。

于 2011-08-23T18:02:20.383 回答