【问题标题】:How to properly implement feed(similar to Facebook/Instagram) in Android?如何在 Android 中正确实现 feed(类似于 Facebook/Instagram)?
【发布时间】:2015-12-18 01:56:27
【问题描述】:

我对 Android 很陌生。我正在尝试创建一个包含大量图像和一些元数据的社交应用程序。它有一个类似于 Facebook 上的提要的屏幕。我想让这个屏幕尽可能的流畅和标准。

以下是我正在使用的库:OkHttp、Picasso、Retrofit、Gson。

现在,我一次性获取所有 json,因为我在后端植入了虚拟值并且响应足够小。但是,在未来,它将具有previous 和next 字段来限制json 响应。

我现在的一些问题:

  1. 我正在使用 Picasso 和 OkHttp。那是将图像也缓存在磁盘中还是仅在内存中?

  2. 缓存提要的最佳做法是什么?由于大部分内容是图像,我应该让 Picasso 处理缓存还是我应该自己缓存一些项目?从 JakeWharton 听说过 DiskLruCache 库,但没有尝试过。我应该去吗?

  3. 如何在缓存中保持滚动的任一方向的某些提要内容(如 3 或 4),以使滚动看起来平滑,并且图像在进入视图后不会开始加载。

    李>
  4. 当用户滚动在这一次获取的所有内容时,如何使用上一个和下一个字段自动处理 json 响应。基本上我想根据游标滚动的内容数量来触发请求。

  5. 假设有一个赞按钮并且用户单击它,我应该更改 UI 中的赞数并通过发送 POST 请求来更新计数器,还是应该发送请求并等待更新的计数器在 UI 中更新之前从服务器获取?

我已经浏览了Instamaterial 的源代码并且学到了一些了不起的东西。但它并没有展示整个后端集成。

我只是想知道是否有任何其他开源应用程序可供我学习或学习。如果您知道任何也会有所帮助的教程。我只是想让应用体验尽可能流畅,并想学习一些最佳实践。

【问题讨论】:

  • 在 youtube 上有一个很好的系列。寻找“新波士顿”
  • @XxGoliathusxX 他们有一个通用的android开发系列。如果您指的是某些特定的视频,请您发布链接。

标签: android performance caching retrofit picasso


【解决方案1】:
  1. 这将缓存到磁盘和内存。如果您将 Picasso 设置为调试模式,它将显示一个指示器,描述图像从哪里加载(内存/磁盘/网络)

  2. 如果您不介意毕加索控制缓存的时间等,那么让它处理缓存应该没问题。我也很确定毕加索使用DiskLruCache

  3. 如果您在这里主要关心的是图像,它们都将被缓存,并且在它们完成一次后不需要加载(直到它更新)。您还可以向 Picasso 注册回调,以更改显示或隐藏占位符的逻辑。

  4. 我认为您正在寻找的是列表视图上的滚动侦听器(我假设您使用的是列表视图)。当它超过某个位置 (5/6) 时开始加载下一个 10。如果您使用的是 recyclerview,您可以使用滚动侦听器中的 onScrollStateChanged 函数执行此操作,并使用 LinearLayoutManager 调用 findLastVisibleItemPosition

  5. 采用哪种方法并不重要。如果您认为更新服务器计数器需要很长时间(它不应该),那么最好先在本地更新它。

【讨论】:

  • 第四点,假设在 json 响应中,我得到 10 个项目,并且有下一个和上一个的标准字段,当附加到 api 查询时,将获取上一个或下一个 10 个项目。我如何确保一旦用户看到第 8 或第 9 个项目并继续滚动(意味着他想查看更多项目),我会获取接下来的 10 个项目。它与 facebook 应用程序中的场景类似。
  • 我已经更新了我的答案,我认为你在寻找什么
  • 是的,没错。只有一个区别,我使用的是 RecyclerView。我还没有看到或写过任何相同的代码。如果您知道任何好的教程或解释,请通过链接发送。谢谢。
  • 我不确定您正在寻找什么好的教程。如果您希望在 RecyclerView 中复制相同的功能,应该这样做recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if(((LinearLayoutManager) recyclerView.getLayoutManager()).findLastVisibleItemPosition() == 5) //Load more items } });
【解决方案2】:

1.我建议您查看 Facebook 的图像管理库,即Fresco,与其他图像加载库相比,它非常棒且成熟。

2.Fresco 使用 3 层架构(BITMAP_MEMORY_CACHEENCODED_MEMORY_CACHEDISK_CACHE)处理所有图像缓存。它还减少了 OOM(内存不足)问题。当视图中的图像离开屏幕时,它会自动回收位图,从而释放内存。

3.如果你已经实现了分页,是的,你可能必须发送上一个记录项的位置或索引,以便你可以获取它之后的项。

4.为了在您的应用中为用户提供流畅的体验,您应该增加计数器并同时将发布请求发送到您的后端。

您也可以查看本教程Facebook like Feed

【讨论】:

  • 我检查了 Fresco,但我发现它的语法与 Picasso 和 Glide 相比有点复杂。毕加索确实有效地满足了我的大部分需求。如果我在使用 Picasso 时遇到任何性能损失,我一定会尝试 Fresco。除了图像,我是否应该使用 DiskLruCache 缓存其他元数据,如用户名、喜欢的数量?另外,由于毕加索自己在缓存图像,我不需要用 DiskLruCache 单独缓存它们,对吗?
  • @AmitTiwari 是的,我一开始也是这么说的,但我更喜欢你现在才使用它,因为我在处理一些 JPG 和 PNG 图像时遇到了一些问题。毕加索导致错误,Fresco 在相同的图像上工作正常。所以从现在开始继续使用壁画。
  • @MBH 我去看看。
  • @AmitTiwari 使用 Fresco 肯定有点复杂,但是当你开始使用它时。你会明白它的真正力量:)
【解决方案3】:

对于您的一些问题,我希望您采用一些方法:

用于处理 JSON

您可以使用名为Retrofit 的库,因此在服务器端添加和删除内容将很容易在您的android 客户端中处理。只需在 Java 类中删除或添加变量就足够了!

用于兑现图片

我建议你使用Fresco,facebook 库,它会让你的工作轻松很多。因为它可以处理圆角转换、下载进度条、圆形图像和更多功能。因此,不仅为您处理内存和磁盘兑现,而且还可以更好地处理不同的图像格式。

(我在上一个项目中使用了 picasso,一些图片和一些 URI 效果不佳,我尝试了 Picasso、Glide 和 Universal Image Loader,在完全相同的图像和相同的链接上......只有 Fresco 对我来说可以正常工作)

这并不能完全回答您的问题,但是,我想与那些可能对您有所帮助的库分享我的经验。

【讨论】:

  • 谢谢。我一定会试试 Fresco。
猜你喜欢
  • 2014-11-20
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多