1

カスタム アダプターを実装して、場所に関連する情報を表示するダイアログ ボックスを作成しました (ダイアログの各エントリは、画像、住所を表示するテキスト フィールド、都市と国を表示するテキスト フィールドで構成されます)。 ...) ViewHolder パターンを使用するほかにアダプターのメソッドを使用する SoftReference クラスを使用して、作成されたビューへの参照を保存し、OutOfMemoryError が発生する前に GC を削除できるようにします。私の目標は、より高速で効率的なキャッシュを構築することです。私のカスタムアダプターのコードの下:

public class LocationsAdapter extends ArrayAdapter<LocationInfo> {

Context context;
int layourResourceId;
List<LocationInfo> locations;

public LocationsAdapter(Context context, int layourResourceId,
        List<LocationInfo> locations) {
    super(context, layourResourceId, locations);

    this.context = context;
    this.layourResourceId = layourResourceId;
    this.locations = locations;
}

@Override
public View getView(int position, View row, ViewGroup parent) {

    LocationItemHolder holder = null;

    if (row != null && ((SoftReference<LocationItemHolder>) row.getTag()).get() != null) {

        holder = (LocationItemHolder) ((SoftReference<LocationItemHolder>) row.getTag()).get();

    } else {

        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        row = inflater.inflate(layourResourceId, parent, false);

        holder = new LocationItemHolder();
        holder.imgMarker = (ImageView) row.findViewById(R.id.imgMarker);
        holder.txtNameStreet = (TextView) row
                .findViewById(R.id.txtNameStreet);
        holder.txtRegion = (TextView) row.findViewById(R.id.txtRegion);

        row.setTag(new SoftReference<LocationItemHolder>(holder));
    }

    LocationInfo location = locations.get(position);
    holder.imgMarker.setImageResource(location.getMarkerId());
    holder.txtNameStreet.setText(location.getNameStreet());
    holder.txtRegion.setText(location.getRegion());

    return row;
}

class LocationItemHolder {
    ImageView imgMarker;
    TextView txtNameStreet;
    TextView txtRegion;
}
}

私は物事を可能な限り効率的にすることに非常に興味があります。コードは私が望むものを作っていますが、SoftReference クラスをうまく利用しているかどうかはわかりません。たとえば、(LocationItemHolder) ((SoftReference ) row.getTag ()).get()という文は、メソッド getView が呼び出されるたびに目的のオブジェクトを取得するために呼び出されるメソッドの数が原因で、キャッシュが無効になると思います。また、複数のキャストが必要です。その文はキャッシュを非効率にすることができますか?. Android のアダプタのコンテキストで SoftReference を使用することをお勧めしますか?

回答ありがとうございます:D

4

2 に答える 2

3

私が知る限り、SoftReferenceここで s を使用しても意味がありません。ビューを正しくリサイクルしている場合 (そうであるように見えます)、LocationItemHolder(同じアダプター内で) 常に同じである のインスタンスはいくつかしかありません。それらが無効になるのは、アダプターが使用されなくなったときだけです。

于 2012-05-01T22:54:23.293 に答える
3

前述のとおり、使用する必要はありませんSoftReferences

OutOfMemory エラーを引き起こすアプリケーションに問題がありますか? そうでなければ、壊れていないものを修正しようとしても意味がありません。

「わずかな効率については忘れるべきです。たとえば、約 97% の確率で: 時期尚早の最適化は諸悪の根源です。」

于 2012-05-01T23:12:09.270 に答える