从ASyncTask或Thread运行服务?

时间:2012-10-05 05:17:58

标签: android multithreading android-asynctask android-service android-lifecycle

我有一个Android应用,它使用服务在应用打开时不断更新视图中的textview。它使用它发送意图的广播接收器更新它。根据应用程序的性质,即使应用程序退出/视图消失,服务仍需继续运行。显然,在这种情况下在主线程上运行服务并不明智,因为这会占用太多并最终强制关闭并使应用程序崩溃。那么保持这项服务运行的最佳方法是什么? ASyncTask?一个单独的线程?我该怎么做呢?我尝试了这样的ASyncTask:

private class MyTask extends AsyncTask {

    @Override
    protected Object doInBackground(Object... objects) {
        return getActivity().getApplicationContext().startService(intent);
    }

    @Override
    protected void onCancelled() {
        getActivity().getApplicationContext().stopService(intent);
        super.onCancelled();
    }
}

哦,是的,我正在使用getActivity()。getApplicationContext(),因为它位于片段内。

所以这很好用;当我想要启动它时,我调用MyTask.execute(),当我想停止它时调用MyTask.cancel(true),但我很确定我没有使用它应该如何使用它。我甚至不知道我应该使用什么作为执行方法的参数(??)。并且它似乎不是最好的想法,只是在它中启动一个服务,没有别的,肯定只使用一个线程可以更好地工作?什么是正确的方法,以使其按照预期的方式工作?顺便说一下,虽然这比在主线程上运行它的时间长得多,但它仍然会在几个小时后崩溃。

4 个答案:

答案 0 :(得分:3)

您可以使用异步任务在android中执行后台任务。除非在特定情况下,否则自行处理线程是不明智的。异步任务将在后台线程中运行,即使用户切换到另一个视图,您也可以使用onProgress()更新定期获取回调。以下是一些关于异步任务的优秀教程,可帮助您入门。请仔细阅读它们,因为异步任务将在android开发中为您提供很多帮助。

http://mobileorchard.com/android-app-developmentthreading-part-2-async-tasks/

http://www.vogella.com/articles/AndroidPerformance/article.html

这是官方文档: https://developer.android.com/reference/android/os/AsyncTask.html

答案 1 :(得分:1)

更新:我想我弄明白了。我离开了我认为我需要做的事情,显然对于我所拥有的那种服务我只需要在前台运行它(所以使用startForeground()方法)。它似乎现在正在运作。遗憾!

答案 2 :(得分:0)

您不应该在事件线程之外的另一个线程中启动服务,而是如果某些代码需要更长的时间在服务中执行,则将该代码仅放在Service Class中的另一个线程中。

要在主应用程序以外的其他进程中执行Service,您应该在服务中的清单文件中定义进程标记。

答案 3 :(得分:0)

在后台thred上调用startService不会使服务在后台线程上运行。 您应该正常调用startService,而不使用Async Task。 在您的服务中,您应该创建一个新线程来完成工作。在这里你不应该使用AsyncTask,因为这个服务可以无限期运行,它不是一个定义的任务。