Какие подводные камни при использовании статических функций?Как в этом коде Android - PullRequest
0 голосов
/ 30 сентября 2010

Я использую в 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;
                }

Ответы [ 3 ]

2 голосов
/ 30 сентября 2010

Я использую в getView () - метод этого примера статическую функцию для загрузки источника ImageView.

В этом посте блога я не вижу статического метода.

Из-за того, что в некоторых случаях (когда я выполняю прокрутку очень быстро), изображения смешиваютсяup.

Это не имеет ничего общего со статическим методом, а также с применением изображений.Ряды перерабатываются.Следовательно, если загрузка изображения занимает слишком много времени, возможно, изображение больше не нужно - вместо ImageView должно отображаться какое-то другое изображение.Одним из способов решения этой проблемы является добавление URL-адреса изображения, необходимого для ImageView в setTag(), на саму ImageView.Когда загрузка завершится, перед помещением загруженного изображения в ImageView, наберите getTag() и сравните URL-адреса.Если URL-адрес в теге отличается от URL-адреса, который был загружен, не обновляйте ImageView, так как это будет для неправильного изображения.

1 голос
/ 01 октября 2010

Я исправил это, не повторно используя средства визуализации (это действительно звучит более болезненно, чем на самом деле), а вместо этого «кэшировал» их, используя массив с WeakReference объектами. Это делает ваш список быстрым и не позволяет устанавливать изображения на средства визуализации, которые теперь используются для других данных, и в то же время дает ГХ возможность удалить неиспользуемые элементы списка, если у вас мало памяти.

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;
}

Вы должны привести _renderers [position] к WeakReference, потому что java не поддерживает массивы с обобщениями, поэтому _renderers является массивом Objects

0 голосов
/ 30 сентября 2010

Если статическая функция не имеет побочных эффектов, то она должна быть абсолютно безопасной для использования. Судя по вашему описанию функции, она имеет побочные эффекты, поэтому вам нужно убедиться, что вызов функции из разных мест не вызывает никаких конфликтов. Я не могу больше сказать тебе ничего, не увидев функцию.

...