Android中的碎片和线程

5
我是一名有用的助手,可以为您翻译文本。

我有一个使用片段的MainActivity。

MainActivity的onCreate使用

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

作为MyWelcomeFragment的onResume的一部分,一个线程被启动来从我的Web服务器获取更新。如果用户在线程完成之前选择了一个操作并转到MyNewsFragment,那么仍未完成运行的线程会发生什么情况?线程是这样创建的:(myThread和handler是实例变量)
  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();

线程栈是什么? - dcow
1
如果onTaskDone试图更新视图部分而Activity已经完成,那么它可能会有问题。为什么不使用标准的AsyncTask API呢? - Aritz
线程将一直运行,直到完成任务。 - amodkanthe
谢谢,我已经放弃使用AsyncTask(对我来说,使用Thread更容易,完成后我只需广播一条消息在MainUI上运行)。 - justdan0227
3个回答

2
Dalvik会在运行时保留所有线程引用,因此除非线程被终止或完成(某些参考),否则线程将继续运行。因此,取决于您在何处启动线程,您可能会创建多个线程。没有干净的方法可以取消一个线程,在这种情况下,您可能需要先取消sendDataToServer中的http请求,并使用共享标志停止线程。
在更大的图景中,我建议:
将网络方法移到Activity中处理,因为它的生命周期比Fragment更长。
使用Android Volley来处理网络请求。使用它可以管理意外的多个请求发送到服务器的数据。由于每个请求都可以附加标签,在启动新请求之前,您可以取消队列中带有特定标签的任何请求(在您的情况下对应于sendDataToServer进程)。
最后,使用发布者-订阅者模式,这已经由类似于OttoEventBus的库提供。这允许Fragment或Activity之间进行通信,同时避免与生命周期相关的问题。简而言之:发布者向注册到它的订阅者发出事件,并且与侦听器不同,发布者和订阅者完全解耦。在您的情况下,当sendDataToServer完成时,您不知道包含onTaskDone的Fragment是否仍然存在。如果此方法在Fragment销毁其视图时操作UI,则肯定会出现错误。因此,onTaskDone应该包装在一个订阅者方法中,其父Fragment已注册到http事件发布者并在其视图被销毁时立即注销。

1
它将一直运行,直到run()方法完成,这可能需要sendDataToServer("")完成的时间,因为与网络IO相比,处理程序应该相当快 - 或线程被强制中断。
如果用户切换片段,您仍然对结果感兴趣吗?
您是否保留了欢迎片段的引用?(通过片段管理器或活动)-如果是这样,您仍然可以访问结果。
如果用户回到欢迎片段,先前的线程引用将丢失。

任务完成后,结果将被写入共享首选项,并更新计数。这只需要在片段被激活时发生,这就是为什么它不在主活动中的原因。 - justdan0227

0

线程将一直运行,直到MyWelcomeFragment仍然存在,如果你没有在onPause()中杀死它。


这不是真的。如果线程没有被杀死并且仍然存活,即使 Fragment 或 Activity 已被销毁,线程仍将继续运行。 - inmyth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接