【问题标题】:Android ListView blocks UIAndroid ListView 阻塞 UI
【发布时间】:2015-08-24 19:28:30
【问题描述】:

我有下面的 ListView 适配器代码!它工作正常,但是当它从服务器加载图像时,它会阻塞 UI。我将 BitmapFactory.decodeStream() 方法放在单独的线程中,然后它只为列表视图中的第一个对象加载一个图像有什么想法吗?

 @Override
    public int getCount() {
        return applicationList.size();
    }

    @Override
    public ApplicationPojo getItem(int position) {
        return applicationList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    public View getView(final int position, View view, ViewGroup parent)
    {

        if (view == null)
        {
            holder = new ViewHolder();

            view = inflater.inflate(R.layout.singleapp, null);
            holder.appName = (TextView) view.findViewById(R.id.appName);
            holder.developer = (TextView) view.findViewById(R.id.developer);
            holder.rate = (TextView) view.findViewById(R.id.rateApp);

            view.setTag(holder);
        }
        else
        {
            holder = (ViewHolder) view.getTag();
        }

        try
        {
            final View finalView = view;

            holder.logo = (ImageView) finalView.findViewById(R.id.appLogo);
            logoName = applicationList.get(position).getLogo();

            logoImg = BitmapFactory.decodeStream((InputStream) new URL(IPClass.SERVERIP + logoName).getContent());

            holder.logo.setImageBitmap(logoImg);
            holder.appName.setText(applicationList.get(position).getName());
            holder.developer.setText(applicationList.get(position).getDeveloper());
            holder.rate.setText(String.valueOf(applicationList.get(position).getRate()));
        }
        catch (Exception ex)
        {
            Log.d("Adapter Exception", ex.toString());
        }
        return view;
    }

    public class ViewHolder
    {
        ImageView logo;
        TextView appName;
        TextView developer;
        TextView rate;
    }

【问题讨论】:

  • 有数百个与此相关的 SO 帖子。除了搜索,这里是一个不错的起点:developer.android.com/training/displaying-bitmaps/…
  • 您好,只需搜索 Async Task,然后将我在下面发布的行放在 AsyncTask 中...
  • 我没有看到您的 decodeStream 在单独的线程中工作...

标签: android multithreading listview


【解决方案1】:

您是否也处理退避、缩放、内存和缓存?我强烈推荐使用PicassoPicasso.with(context).load("http://www.url.com/image.png").into(holder.logo);

【讨论】:

  • 今天我用毕加索!!!效果非常好!非常感谢你。你就是男人!
【解决方案2】:

当需要在列表视图中加载位图时,我更喜欢这个解决方案: 下载图像后,将位图添加到缓存。

http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

在后台下载图片,下载后显示并添加到缓存中。 在某个位置的“listview getView”的下一次迭代中,检查位图是否已经在您的缓存列表中并从那里加载它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多