Android中的碎片和线程

时间:2015-04-20 15:52:58

标签: android multithreading android-fragments

我有一个使用片段的MainActivity。

MainActivity的onCreate使用

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

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

使用以下函数创建线程:( 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();

3 个答案:

答案 0 :(得分:2)

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

从更大的角度来看,我建议

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

答案 1 :(得分:1)

它会一直运行直到run()方法完成,这可能是sendDataToServer(“”)完成所花费的时间,因为处理程序应该比网络IO相当快 - 或者线程是强行打断了。

如果用户切换片段,您是否仍然对结果感兴趣?

您是否保留对欢迎片段的引用? (通过片段管理器或活动) - 如果是这样,您仍然可以访问结果。

如果用户返回欢迎片段,则先前的线程引用将丢失。

答案 2 :(得分:0)

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