【问题标题】:Best practice on passing data between fragment that is hosted by another activity在另一个活动托管的片段之间传递数据的最佳实践
【发布时间】:2018-01-24 19:10:41
【问题描述】:

将数据从 Activity 传递到 Fragment 的最佳方式是什么,但 Fragment 由另一个 Activity 托管。

详细说明: 活动 A 托管片段 A(活动 A 中的内容)

我已经做到了,但显然,我的做法导致了一些内存泄漏。

一个例子是在活动关闭时刷新片段中包含的 RecyclerView,但我不想把它放在 onResume 中。

activity中包含的接口(不是宿主)

public class Activity extends AppCompatActivity{
    public static OnlistenClose delegate;
    public interface OnlistenClose {
        void refreshList();
    }
}

//实现接口的片段

public class FragmentB extends Fragment implements Activity.OnlistenClose{

       Activity.delegate = this;

       @Override
       public void refreshList(){
          //my code
       }
}

使用 square/leakcanary 表示有泄漏。

【问题讨论】:

  • 你的方法是什么?分享代码,以便人们可以查看和提供帮助。
  • 更新此评论
  • 你不应该在两个类之间使用静态interface,这会导致内存泄漏。使用Intent 将数据从一个活动发送到另一个活动,然后将接收到的数据作为参数传递给要打开的片段。

标签: android interface


【解决方案1】:

将数据从 Activity 传递到 Fragment 的最佳方式是什么,但 Fragment 由另一个 Activity 托管。

最终,您将数据从一个活动传递到另一个活动。如果数据永久存储在数据库或文件中,那么接收活动应该在第一个活动更新数据后才读取数据。

另一方面,如果您传递的数据只需要在内存中可用,那么您可以使用 Intent 传递数据。

如您所见,在另一个活动中保留对一个活动的引用会导致内存泄漏。您尝试使用的回调方法仅对拥有该片段的活动有效,对第二个活动无效。相反,您应该尊重活动生命周期并酌情使用 Intent 进行通信。

【讨论】:

    【解决方案2】:

    没有针对一般问题甚至特定情况的“最佳做法”。

    标准的数据传递方式:

    • Intents
    • Storage
      • 共享首选项
      • 内部存储
      • 外部存储
      • SQLite 数据库
      • 网络连接
    • 静态类(无需链接)
    • 等等等等

    有很多方法可以完成一项任务,因为有很多方法可以用一句话来描述该任务。

    • 我完成了我的工作。
    • 我完成了我的任务。
    • 它已在 Play 商店中发布。
    • 我已经完成了。
    • 我无事可做。

    【讨论】:

      猜你喜欢
      • 2021-11-30
      • 2023-03-30
      • 2014-04-03
      • 1970-01-01
      • 2019-11-20
      • 2012-12-24
      • 1970-01-01
      相关资源
      最近更新 更多