2012-07-16 103 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