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()私はこのエラーになります:

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マップが独自のマップタイルに対して行うのと同じ方法で、最終結果に対して1つのリクエストを実行します。

于 2011-08-23T18:02:20.383 に答える