3

私のアプリでは、何百ものマーカーを追加する必要があります (場合によっては)。このために、デフォルトのマーカーを使用している場合、悪い解決策ではないように思われる「for ループ」を使用しています。AsynkTaskクラスの助けを借りてインターネットからダウンロードしているマーカーごとにカスタム画像を使用する必要がありますLoader()。しかし、カスタム マーカーを使用すると、「for ループ」が終了するまで UI がフリーズします。

マーカーの追加:

private List<User> mUsers = new ArrayList<User>();
private GoogleMap mMap;
Bitmap bAvatar;

.............

private void drawMarkers() {
        mMap.clear();
        for (User user : mUsers) {
            if (user.getGeohash() != null) {
                LatLng pos = gh.decode(user.getGeohash());
                if (user.getAvatar() != null) {
                    try {
                        bAvatar = new Loader().execute(user.getAvatar()).get();                     
                    } catch (InterruptedException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    } catch (ExecutionException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                    mMap.addMarker(new MarkerOptions()
                            .position(pos)
                            .title(user.getStatus())
                            .icon(BitmapDescriptorFactory.fromBitmap(bAvatar)));
                } else {
                    mMap.addMarker(new MarkerOptions()
                            .position(pos)
                            .title(user.getStatus())
                            .icon(BitmapDescriptorFactory
                                    .defaultMarker(BitmapDescriptorFactory.HUE_RED)));
                }

            }
        }
    }

画像をダウンロードするための AsyncTask:

public class Loader extends AsyncTask<String, Void, Bitmap> {
    Bitmap bitmap;

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
    }

    protected Bitmap doInBackground(String... urls) {
        String urldisplay = urls[0];
        Bitmap mIcon11 = null;
        try {
            InputStream in = new java.net.URL(urldisplay).openStream();
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inPurgeable = true;
            options.inInputShareable = true;
            mIcon11 = BitmapFactory.decodeStream(in, null, options);
        } catch (Exception e) {
            String error = (e.getMessage() == null) ? "doInBackground - Loader"
                    : e.getMessage();
            Log.e("Error", error);
            e.printStackTrace();
        }
        return mIcon11;
    }

    protected void onPostExecute(Bitmap result) {

        bitmap = result;

    }
}

「for ループ」を、AsynkTask各ユーザーがList<User>非同期的にダウンロードされる場所に置き換える必要があると思います。

  1. 配列の作成AsynkTaskを手伝ってください。List<User>
  2. AsynkTask画像のダウンロードのためにList<User>とを組み合わせる必要がありますか、それとも の中AsynkTaskで使用するのが正しいですか?AsynkTaskAsynkTask

どんな助けでも大歓迎です。前もって感謝します。

4

1 に答える 1

0

初め:

  • ネストされた AsyncTasks は使用しないでください。それはサポートされていません。
  • ただし、ユーザーのために画像のダウンロードを組み合わせるようにしてください。

必要な作業は次のとおりです。

  • メソッドでユーザーをループする非同期タスクを作成しますdoInBackground
  • doInBackgroundユーザーごとに、ビットマップをダウンロードし、
  • publishProgressビットマップを取得したら、メソッドを使用します。
  • 呼び出しにより、マップにマーカーを追加できる UI スレッドでメソッドpublishProgress がトリガーされます。onProgressUpdate

Android 開発者サイトでDownloadFilesTaskの例を参照してください。

于 2013-07-08T22:35:02.803 に答える