【问题标题】:Universal Image Loader inside RemoteViewsFactory for Android widget用于 Android 小部件的 RemoteViewsFactory 内的通用图像加载器
【发布时间】:2013-11-14 22:24:47
【问题描述】:

我想发布一个问题的解决方案。 希望它能帮助其他面临同样问题的人。

这与可用的 Android 通用图像加载器库有关 here

最初的问题是:

我今天开始使用您的 Android 通用图像加载器 (AUIL),非常好用! 感谢您分享这个!

我知道可以在 Provider 类内的 android 小部件项目中使用 AUIL,但我正在尝试在 ListView 内加载多个图像(它本身在小部件内)。

【问题讨论】:

    标签: android android-widget universal-image-loader remoteview


    【解决方案1】:

    我设法找到的解决方案是

    public class YourViewsFactory implements RemoteViewsService.RemoteViewsFactory
    {
     Map<Integer, Boolean> flags = Collections.synchronizedMap(new HashMap<Integer, Boolean>());
     Bitmap mBitmap;
     Handler handler = new Handler(Looper.getMainLooper());
    
    
      @Override
      public RemoteViews getViewAt(final int position)
    {
      final RemoteViews row = new RemoteViews(ctxt.getPackageName(), R.layout.row);
      flags.put(position, false);
      handler.post(new Runnable()
      {
        @Override
        public void run()
        {
            m_imgLoader.loadImage(YOUR_IMAGE_URL, new SimpleImageLoadingListener()
            {
                @Override
                public void onLoadingStarted(String imageUri, View view)
                {
                }
    
                @Override
                public void onLoadingFailed(String imageUri, View view, FailReason failReason)
                {
                    flags.put(position, true);
                }
    
                @Override
                public void onLoadingCancelled(String imageUri, View view)
                {
                    flags.put(position, true);
                }
    
                @Override
                public void onLoadingComplete(String arg0, View arg1, Bitmap bitmap)
                {
                    mBitmap = bitmap;
                    flags.put(position, true);
                }
            });
        }
    });
    
    while (!flags.get(position))
    {
        try
        {
            Thread.sleep(100);
        } catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }
    flags.put(position, false);
    if (mBitmap != null)
    {
        row.setImageViewBitmap(R.id.ivPoster, mBitmap);
    } else
    {
        row.setImageViewResource(R.id.ivPoster, R.drawable.cw);
    }
    mBitmap = null;
      } // End of getViewAt override
    
    
    } // End of class
    

    这不是我的解决方案,而是 Vova Klyshevich 可用的解决方案之一here

    【讨论】:

    • 这仍然与最新版本的库相关吗?为什么不直接使用 loadImageSync(...) ?
    • 当列表有大约 20 个元素时,滚动速度非常慢。经过一些上下循环后,它会导致启动器崩溃。
    • @azerto00 你能告诉我如何在你的代码中维护缓存吗?
    • 对不起@anil,好久没用Android nox开发了。真的帮不了你..
    猜你喜欢
    • 2013-07-14
    • 2013-03-28
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 2016-06-23
    相关资源
    最近更新 更多