我应该使用线程或服务在Android后台运行任务吗?

时间:2013-06-07 20:03:09

标签: android multithreading networking service

我正在构建一个Android库来从主机应用程序收集数据,并在后台将此数据发送到在线服务器。我意识到这需要某种多线程/使用服务/分叉。

应用程序只是通过库调用继续添加数据,库应该在后台处理这些数据的发送而不会干扰主UI。

我应该如何制作这个图书馆?整个图书馆应该在Android服务上运行吗?我应该使用另一个线程吗?这是我第一次涉足并行。我不确定最好的办法是什么。

赞赏详细的回复。

4 个答案:

答案 0 :(得分:1)

对于您描述的情况,服务将是更可靠的解决方案。

我的意思是从服务运行后台线程,而不是从Activity运行。顺便说一下,默认情况下,服务本身不提供单独的线程。

重点是服务的优先级高于活动,因此它们会以较低的概率销毁,因此长期运行的任务不会中断。

答案 1 :(得分:1)

有些答案并不完全正确。服务(Android服务组件)不能在后台运行,它们在默认的UI线程中运行。

说实话,这个问题不应该是服务或线索或任何东西。你的库不需要启动服务,它可能只是一个类(单例/静态,无论它是什么)应该扩展AsyncTask(或在后台运行的任何其他东西我将稍微解释)并使用doInBackground方法将东西发送到服务器。注意AsyncTask只是一个内部线程。所以这就是我要做的事情:

让我们调用您的库的主类,它与您的服务器ServerHelper连接。您可以将其设为单身(或静态,但这是一个单独的讨论)。在这个类中创建一个内部类,说ServerHelperCommandTask并扩展AsyncTask。您真的应该详细查看AsyncTask以了解其工作原理。因为要求您覆盖doInBackGround。您在此方法中放置的任何内容都将自动从UI中的单独线程中获取。然后调用一个名为onPostExecute的回调,您可以覆盖该回调,因为您将从此处获取doInBackground的结果。在mainThread中调用此OnPostExecute,以便您可以在此处检查说错误结果等。

这是最简单的方法;但是,还有许多其他方法和库可以帮助您建立网络并在内部处理所有后台内容。 Google刚刚发布了一个名为Volley的库,您可以插入并使用它,因为它会为您执行所有并行处理。但这可能需要一些学习曲线。希望您了解AsyncTasks,如果推送的数据不是很多,那么AsyncTasks就是您的选择。另请注意,您可以调用多个AsyncTasks,但表面上看起来它正在启动多个并行线程,这不太准确,因为蜂窝内部可以调用5个Asynctasks,但所有这5个任务都将按顺序执行,所以你不必担心序列化。

答案 2 :(得分:0)

你可以做到这两点,但每个解决方案的优点和缺点:

即使您的应用不在前台,服务也会在后台运行。 sers通常不喜欢让服务无所事事。 根据您的描述,当应用程序处于前台时,您似乎只需要运行此线程吗? 如果是这样,普通线程可以完成这项工作。

但是,服务可能更容易实现。

希望有所帮助

答案 3 :(得分:0)

在这种情况下,您绝对应该使用服务。异步任务和手动创建线程并不适合需要在后台运行以进行网络通信的计算。使用Async任务进行长时间运行的本地计算(例如,对于进行排序的算法)。

请注意,如果您使用某项服务,它本质上不会作为后台线程运行!您需要手动处理线程。为了避免这种麻烦(特别是如果这是你第一次使用多线程),请使用IntentService

与任何其他服务一样,可以使用startService方法调用IntentService,但IntentService类能够处理生产者/消费者模式中的多个调用。这意味着您可以使用startService方法自动将命令排队到服务。在您创建的IntentService类中,您可以通过查看作为startService方法中的参数一起发送的intent内的给定操作来处理不同类型的命令。

这是一个如何实现IntentService的示例:

public class SimpleIntentService extends IntentService {

public SimpleIntentService() {
    super("SimpleIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
    String commnad = intent.getAction();

    //handle your command here and execute your desired code depending on this command
}

}