我有一个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),但我很确定我没有使用它应该如何使用它。我甚至不知道我应该使用什么作为执行方法的参数(??)。并且它似乎不是最好的想法,只是在它中启动一个服务,没有别的,肯定只使用一个线程可以更好地工作?什么是正确的方法,以使其按照预期的方式工作?顺便说一下,虽然这比在主线程上运行它的时间长得多,但它仍然会在几个小时后崩溃。
答案 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,因为这个服务可以无限期运行,它不是一个定义的任务。