Android中的碎片和线程

jus*_*227 5 multithreading android android-fragments

我有一个使用片段的MainActivity.

MainActivity的onCreate使用的完成onCreate

welcomeFragment = new MyWelcomeFragment();
fr.beginTransaction().replace(R.id.mainContent, welcomeFragment).commit() 
Run Code Online (Sandbox Code Playgroud)

作为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();
Run Code Online (Sandbox Code Playgroud)

inm*_*yth 2

Dalvik 在运行时保留所有线程引用,因此您的线程将继续运行,除非它终止或完成(一些参考)。因此,根据您开始线程的位置,您可能会创建多个线程。没有干净的方法来取消线程,在这种情况下,您可能需要首先取消 sendDataToServer 内的 http 请求,并使用共享标志来停止线程。

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

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