2011-05-16 73 views
0

是否可以從Runnable執行AsyncTask?根據我的經驗可以完成,但不安全。當我的應用第一次運行時,我的AsyncTask可以從Runnable中正常運行。但是,當應用程序移動到後臺,然後帶回前面我得到「不能創建處理程序內部沒有調用Looper.prepare()」的線程。從runnable調用asynctask

下面是我想要做的: 我正在使用MapView並在onCreate中調用runOnFirstFix(Runnable)。我的Runnable調用一個AsyncTask來執行一個Web服務調用,它根據位置返回一些數據。 我將應用程序移動到背景(通過點擊主頁按鈕),一段時間後,我再次將應用程序向前移動,並在我調用AsyncTask的execute()時得到異常。

首先,爲什麼runOnFirstFix被再次執行?其次,它爲什麼第二次引發異常? 我猜測有一些我不明白的生命週期部分。

謝謝。

+2

爲什麼你將'AsyncTask'調用封裝到'Runnable'中?它的'doInBackground'方法在後臺線程中運行,在'onPre-'和'onPostExecute'中,您可以操作您在UI線程中聲明的gui和其他東西。另一方面,當你將應用程序放到前臺時,你的'onCreate'方法被調用,這就是爲什麼'runOnFirstFix'再次運行。 – rekaszeru 2011-05-16 05:53:05

+0

我想重用現有的AsyncTask,但我想我可以將該邏輯直接移入Runnable。至於runOnFirstFix的第二次調用,我不相信它是(直接)因爲你陳述的原因,而是因爲我正在onCreate()實例化一個MyLocationOverlay的新實例, – cagreen 2011-05-16 13:33:19

回答

0

我最初並不清楚AsyncTask需要從UI線程調用。所以當runOnFirstFix第二次運行時,它是來自一個不在UI線程中的Runnable。爲了解決這個問題,我簡單地創建了另一個Runnable來運行AsynchTask。

我的runOnFirstFix似乎被調用兩次的原因僅僅是因爲我正在創建它的一個新實例。