gpt4 book ai didi

android - Android 中的 fragment 和线程

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:54:11 25 4
gpt4 key购买 nike

我有一个使用 fragment 的 MainActivity。

MainActivity的onCreate使用

完成它的onCreate
welcomeFragment = new MyWelcomeFragment();
fr.beginTransaction().replace(R.id.mainContent, welcomeFragment).commit()

作为 MyWelcomeFragment 的 onResume 的一部分,一个线程开始从我的网络服务器获取更新。如果用户在线程完成之前选择了一个操作并转到 MyNewsFragment,那么在 MyWelcomeFragment 的线程堆栈中尚未完成运行的线程会发生什么情况?

线程创建时使用:(myThread 和处理程序是实例变量)

  myThread = new Thread(new Runnable() {
@Override
public void run() {
sendDataToServer("");
handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
public void run() {
onTaskDone();
}
});
}
});
myThread.start();

最佳答案

Dalvik 在运行时保留所有 Thread 引用,因此您的线程 将继续运行 除非它被终止或完成(一些 reference )。因此,根据您开始线程的位置,您可能会创建多个线程。有 no clean way取消线程,在这种情况下,您可能需要先取消 sendDataToServer 中的 http 请求,然后使用共享标志来停止线程。

从大局来看,我建议

  • 将网络方法移至 Activity 并在那里处理它,因为它的生命周期比 fragment
  • 使用 Android Volley 处理网络。有了它,您可以管理无意中向服务器发送数据的多个请求。由于每个请求都可以附加标签,因此您可以在开始新请求之前取消队列中带有特定标签的任何请求(在您的情况下,该请求对应于 sendDataToServer 进程)。
  • 最后使用发布者-订阅者模式,该模式已经被像Otto 这样的库提供了。或 EventBus .这允许 fragment 或 Activity 之间的通信,同时避免与生命周期相关的问题。要点:发布者向注册到它的订阅者发出事件,与听众不同,发布者和订阅者是完全分离的。在您的情况下,当 sendDataToServer 完成时,您将不知道包含 onTaskDone 的 fragment 是否仍然存在。如果此方法在 fragment 销毁其 View 时操作 UI,那么您肯定会收到错误。因此 onTaskDone 应该包装在订阅者方法中,该订阅者方法的父 fragment 已注册到 http 事件发布者,并在其 View 被销毁后立即注销。

关于android - Android 中的 fragment 和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29752618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com