使用静态函数时有哪些缺陷?喜欢这个Android代码

时间:2010-09-30 16:18:18

标签: java android listadapter expandablelistadapter static-functions

我在getView() - this example方法中使用静态函数来下载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 个答案:

答案 0 :(得分:2)

  

我在getView()中使用 - 这个例子的方法是一个静态函数来下载ImageView的源代码。

我在博客文章的任何地方都没有看到静态方法。

  

因为我经历过,在某些情况下(当我滚动得非常快)时,图像会混淆。

这与静态方法无关,与应用图像有关。行得到回收。因此,如果图像下载时间过长,则可能不再需要图像 - ImageView应显示其他图像。解决此问题的一种方法是将ImageView setTag()所需的图片网址粘贴在ImageView上。下载完成后,在将下载的图像放入ImageView之前,请致电getTag()并比较网址。如果代码中的网址与下载的网址不同,请不要更新ImageView,因为这样会显示错误的图片。

答案 1 :(得分: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;
}

你必须将_renderers [position]强制转换为WeakReference,因为java不支持带泛型的数组,所以_renderers是一个对象数组

答案 2 :(得分:0)

如果静态功能没有副作用,那么它应该是非常安全的。根据您对函数的描述,它似乎有副作用,因此您需要确保从不同位置调用函数不会导致任何冲突。如果没有看到这个功能,我真的无法告诉你任何事情。