用于 Android 小部件的 RemoteViewsFactory 内的通用图像加载器

Posted

技术标签:

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

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

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

最初的问题是:

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

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

【问题讨论】:

【参考方案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开发了。真的帮不了你..

以上是关于用于 Android 小部件的 RemoteViewsFactory 内的通用图像加载器的主要内容,如果未能解决你的问题,请参考以下文章

用于 Android 小部件的 RemoteViewsFactory 内的通用图像加载器

android小部件内ListView中的多个可点击项目

Android 桌面小部件(AppWidgetProvider)的应用

Android小部件不同的纵向和横向方向

小部件到底是啥?

Android主屏幕小部件未更新