1

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

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

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

详细的答复表示赞赏。

4

4 回答 4

1

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

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

关键是服务比活动具有更高的优先级,因此它们被销毁的可能性较小,因此您的长时间运行的任务不会被中断。

于 2013-06-07T20:48:50.787 回答
1

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

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

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

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

于 2013-06-07T21:08:09.843 回答
0

您可以两者都做,但每种解决方案都有优缺点:

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

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

希望能帮助到你

于 2013-06-07T20:33:44.810 回答
0

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

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

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

下面是一个如何实现 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
}

}

于 2013-06-07T21:04:05.300 回答