【问题标题】:Create a service inside Thread or Thread inside Service在 Thread 内创建服务或在 Service 内创建 Thread
【发布时间】:2014-08-02 08:08:31
【问题描述】:

对于应该获取和更新新数据的网络作业,建议做什么?我在这个问题上看到了不同的答案。

要创建一个Service,它将在一个新的Thread 中运行,该Thread 应该完成所有网络作业,或者创建一个新的Thread,它将在Service 内部启动一个Thread

【问题讨论】:

    标签: java android multithreading service


    【解决方案1】:

    您不能创建在线程内运行的服务,因此这种可能性是不可能的。您需要一个线程(或 AsyncTask)来执行任何网络请求。如果您希望应用程序在当前 Activity 完成的情况下继续执行网络请求,那么是的,您需要在 Service 中创建该线程(或 AsyncTask)。

    【讨论】:

    • 技术上你可以,但不要变幻无常:-)
    • 嗯,是的,您可以在线程中调用 startService。但它实际上不会导致 onStartCommand 在该线程上运行,这就是我的意思。
    • 服务运行在“主线程”:-),所有的东西都是线程!
    【解决方案2】:

    在android中所有的网络操作都是在一个线程内完成的。即使您正在创建服务,所有网络操作都将在一个线程中完成。 线程内的服务是不可能的。

    现在,如果您希望您的网络操作在多个活动中可用,您应该创建一个服务,否则活动中的一个单独的网络线程将完成这项工作。

    【讨论】:

    • and.... 那么在服务中创建的 THread 呢...如果他从一个 Activity 移动到另一个 Activity @user2452587,它会被销毁吗?
    • 不,它会继续处理,直到网络操作完成。
    • 并且...如果在网络操作之后 Thread 正在尝试组件...不会有危险吗?比如会抛出异常...? @user2452587
    • 我希望This 能给您解答您的问题。
    • 我明白了...这取决于服务本身...谢谢@user2452587
    【解决方案3】:

    IntentServiceonCreate 的主线程上初始化,否则在单独的线程中运行。在这种情况下不需要处理额外的线程。 Service 在主线程中运行并要求您处理线程(如果需要)。最好对IntentService 进行原型设计,因为您只是在进行网络调用。如果网络调用很短,那么只需使用AsyncTask

    【讨论】:

      【解决方案4】:

      我认为你需要IntentService。无需混淆 Thread 内的 Service。在后台线程中启动服务或启动service with background thread。两者都是一样的。

      【讨论】:

        【解决方案5】:

        在服务内部调用线程总是比在线程内部调用服务更好,因为服务是 android 的一个组件,因此它具有一定的优先级。另一方面,线程不是 Android 组件的一部分,因此与服务相比,它没有优先级。

        所以当Android系统开始杀应用程序时,如果内存不足,它会首先杀掉包含该服务的线程,因为它的优先级较低或没有。如果您使用过包含线程的服务,那么您很好。希望对你有帮助:)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-05-20
          • 1970-01-01
          • 2011-03-28
          • 2012-04-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多