2012-07-16 60 views
0

我开发了一个应用程序,其目的之一是将文件上传到服务器。平均而言,文件非常大,上传需要花费很多时间,因此为了确保将其处理到最后,我将IO的关键部分移到了IntentService中。从每个上传的IntentService中,都有一个启动了IO作业的AsyncTask。不幸的是屏幕滚动在后台上传时冻结了几次。我认为IntentService + AsyncTask的组合应该是足够的... 我会很感激任何建议如何解决它..服务中的繁重操作异步任务冻结屏幕

+2

想要发表一些代码吗?特别是'IntentService'和'AsyncTask'?你是否正在UIThread('onPostExecute','onPreExecute'和'onProgressUpdate')上运行的任何'AsyncTask'方法中做任何工作? – 2012-07-16 22:05:55

+0

只需检查一下,您是否正在使用AsyncTask执行doInBackground中的所有重处理? – 2012-07-16 22:08:34

回答

1

我想你可能会滥用IntentService。我假设你从IntentService.onHandleIntent(Intent)呼叫AsyncTask.execute(...)

IntentService被创建为在非UI线程上一次执行一个后台任务。这意味着onHandleIntent(Intent)从后台线程调用,不应该创建AsyncTasks。此外,一旦onHandleIntent(Intent)完成(如果你所做的只是启动一个AsyncTask,它立即执行),该服务就是关闭的候选对象。

我知道这并不直接回答你的问题,但它可能指向问题的原因。 请注意,如果您需要能够同时处理多个请求,那么您最好的办法就是扩展Service并将工作请求排入onStartCommand(...)的Executor。

[编辑]有关正确使用IntentService的更多信息,请查看this

+0

感谢您的回答,我从他们那里得到的是,以下解决方案应该适合完成文件上传任务 http://vmix.googlecode.com/svn/trunk/android/VmixSDK/src/com/vmix/android /vmixsdk/rds/FileUploadService.java – basta 2012-07-17 07:38:35

+0

这是一个好的开始,但很少有理由在Android(或任何Java 5或更高版本)中创建自己的Thread对象。管理你自己的线程可能是有风险的,特别是对于较新的程序员。例如,Thread.stop()方法已被弃用,实际上并没有做你想做的事情。你应该考虑这种工作类型的Executor框架(http://developer.android.com/reference/java/util/concurrent/Executor.html)。它不仅提供了卓越的线程管理,而且还保证了大多数人不理解的与线程安全相关的某些事情。 – zienkikk 2012-07-17 14:18:11