0

getView()で使用します-この例のメソッドは、ImageViewのソースをダウンロードするための静的関数です。後でスレッドが含まれます。ただし、この場合、静的関数の使用を節約する方法を一般的に知りたいと思います。

私が経験したので、場合によっては(私が本当に速くスクロールするとき)、画像が混同されます。

    /**
    * Is called, when the ListAdapter requests a new ListItem, when scrolling. Returns a listItem (row)
    */
        public View getView(int position, View convertView, ViewGroup parent) {
                        View v = convertView;
                        if (v == null) {
                            LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                            v = vi.inflate(R.layout.row, null);
                        }
                        Order o = items.get(position);
                        if (o != null) {
                                TextView tt = (TextView) v.findViewById(R.id.toptext);

                                if (tt != null) {
                                      tt.setText("Name: "+o.getOrderName());                            }

//At this point I use a static function to download the bitmap to set it as source of an ImageView

                        }
                        return v;
                }
4

3 に答える 3

2

getView()で使用します-この例のメソッドは、ImageViewのソースをダウンロードするための静的関数です。

そのブログ投稿のどこにも静的メソッドはありません。

私が経験したので、場合によっては(私が本当に速くスクロールするとき)、画像が混同されます。

これは、メソッドが静的であることとは関係がなく、画像の適用と関係があります。行はリサイクルされます。したがって、画像のダウンロードに時間がかかりすぎる場合は、その画像が不要になった可能性がありますImageView。代わりに、他の画像を表示する必要があります。これに対処する1つの方法は、ImageViewinsetTag()が必要とする画像のURLをImageViewそれ自体に貼り付けることです。ダウンロードが完了したら、ダウンロードした画像をに入れる前に、URLImageViewを呼び出して比較します。getTag()タグ内のURLがダウンロードされたURLと異なる場合は、を更新しないでくださいImageView。これは、間違った画像に使用されるためです。

于 2010-09-30T17:24:31.417 に答える
1

レンダラーを再利用せずに(実際にはそれよりも苦痛に聞こえます)、代わりにWeakReferenceオブジェクトを含む配列を使用してレンダラーを「キャッシュ」することでこれを修正しました。これにより、リストが高速になり、他のデータに使用されているレンダラーに画像を設定できなくなります。同時に、メモリが不足した場合に未使用のリストアイテムを削除する機会がGCに与えられます。

public View getView(int position, View convertView, ViewGroup parent) {
    Renderer result = null;
    WeakReference<Renderer> wr = (WeakReference<Renderer>) _renderers[position];
    if (ref != null)
        result = wr.get();

    if (result == null) {
        result = new Renderer(_context);
        // set the texts here and start loading your images
        _renderers[position] = new WeakReference<Renderer>(result);
    }
    return result;
}

Javaはジェネリックスを含む配列をサポートしていないため、_renderers [position]をWeakReferenceにキャストする必要があります。したがって、_renderersはオブジェクトの配列です。

于 2010-10-01T12:58:48.247 に答える
0

静的関数に副作用がない場合は、完全に安全に使用できるはずです。関数の説明に基づくと、副作用があるように思われるため、別の場所から関数を呼び出しても競合が発生しないことを確認する必要があります。機能を見ないと、これ以上何も言えません。

于 2010-09-30T16:31:59.547 に答える