2

我有一个Android应用程序,它使用服务在应用程序打开时不断更新视图中的文本视图。它使用它发送意图的广播接收器更新它。根据应用程序的性质,即使在应用程序退出/视图消失后,服务仍需要继续运行。显然,在这种情况下在主线程上运行服务并不明智,因为这样做会太多并最终导致应用程序关闭并崩溃。那么保持此服务运行的最佳方式是什么?一个ASyncTask?一个单独的线程?我会如何去做这件事?我有一个像这样的的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(真),但是我很确定我没有使用它,它应该如何使用。我甚至不知道我应该用什么作为execute方法的参数(??)。在其中开始一项服务似乎并不是最好的主意,没有别的,当然,只用一个线程就可以更好地工作?为了使它按照预期的方式工作,有什么正确的方法可以解决这个问题?顺便说一下,虽然这个功能比在主线程上运行时间长得多,但它在几个小时后仍会崩溃。

+0

服务将始终运行在异步线程中。那么上面的代码说什么? –

回答

1

更新:我想我想通了。我在我认为我需要做的事情上走的很远,显然对于我所需要的服务,我只需要在前台运行它(所以使用startForeground()方法)。它现在似乎在工作。抱歉!

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

0

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

+0

我将如何使用服务中的线程?我已经有一个处理程序和一个可用于执行流程的可运行程序;可运行程序将数据发送到更新UI的广播接收器。我是否只是创建一个新线程并启动处理程序并在那里运行?因为我尝试过,但它导致应用程序崩溃。有没有一种方法可以为此创建一个线程? – NSchock

+0

没有具体的创建线程的方法。你有什么异常?运行服务的另一种方式是像Jeet建议的那样将其放入单独的过程中。 – Sameer

+0

而不是在您的服务中创建一个新的线程,只需使用IntentService。这是一个在后台线程上创建的服务。 – Omri374