2014-04-01 56 views
0

因此,我正在編寫一個應用程序,並且有幾個關於如何處理AsyncTasks的問題。 我儘可能詳細地描述我的問題。我有以下類:正確使用AsyncTasks並處理視圖和活動所需的對象

  1. MainActivity - 此活動僅執行setContentView(R.layout.myLayout)和 創建我的CustomLocationListener的對象。版式包含自定義視圖和ProgressBar
  2. CustomLocationListener - 這基本上只是一個類實現LocationListener和具有默認LocationListener方法。除此之外,我還編寫了一種方法來檢查哪些提供者可以使用NETWORK_PROVIDER
  3. 顯示器 - 這只是一個輔助班。我只用它來獲得顯示度量來計算一些事情。
  4. MyCustomView - 該課程擴展了View類。它也有Display類型的屬性(我自己的類)。

現在你應該知道對我的代碼重要的一切。好了,現在我的問題是,如何處理AsyncTasks,因爲這是該步驟的應用程序應該通過:

  1. 獲取用戶設備的當前位置
  2. 執行一些查詢數據庫服務器(MySQL的),並將它們保存非持久(數據由城市名)
  3. 計算用戶的位置,並在數據庫中的城市之間的距離
  4. 做一些其他的計算,以找出位置在哪裏畫在屏幕上
  5. 吸取一切

最重要的是,我想實現一個進度條,它應該是活動的,直到所有的計算都完成並且繪圖階段開始。 所以,我有點困惑在哪裏編碼什麼。我的意思是,兩個計算(步驟3和4)必須相互瞭解。第4步的計算需要第3步的計算結果。我的Activity類也應該知道計算的狀態,因爲我必須在開始繪製時使ProgressBar不可見。

我希望我已經足夠詳細了,感謝您的幫助!

+0

我可以在Activity類中執行所有需要的線程,在完成所有計算後,我可以使ProgressBar不可見。但是我怎麼才能開始畫畫?我的意思是,當我打開活動時,onDraw()立即啓動。如果計算完成,我可以使用If-Else-Block檢查布爾值。但是,我怎麼能在視圖類外的線程中使視圖無效? – Lyte

回答

1

那麼從AsyncTask文檔,你可以收集這些:

當執行異步任務,任務經過4個步驟:

  1. onPreExecute()調用的UI線程執行任務之前。此步驟通常用於設置任務,例如 ,方法是在用戶界面中顯示進度條。

  2. doInBackground(Params ...),在onPreExecute()完成執行後立即在後臺線程上調用。使用此步驟 執行可能需要很長時間的後臺計算。異步任務的參數 傳遞到此步驟。計算結果 必須由此步驟返回,並且將返回到最後一步 。此步驟還可以使用 publishProgress(Progress ...)發佈一個或多個進度單元。 這些值發佈在UI線程的 onProgressUpdate(Progress ...)步驟中。

  3. onProgressUpdate(Progress ...),在調用publishProgress(Progress ...)後在UI線程上調用。執行時間爲 未定義。在後臺計算仍在執行時,此方法用於在用戶界面中顯示任何形式的進度。例如,它可以用來爲進度條設置動畫效果,或者在 文本字段中顯示日誌。

  4. onPostExecute(Result),在後臺計算完成後在UI線程上調用。計算的背景 的結果作爲參數傳遞給此步驟。

那麼,我建議你的是使用兩個AsyncTasks做你的地理和服務器(每個)在doInBackground(Params...)方法工作,並在onPostExecute(Result)方法的返回值,以您的MainActivity。此外,請使用onProgressUpdate(Progress..)方法讓MainActivity知道進度。

完成後,您可以選擇使用另一個AsyncTask來執行計算,如果它們明顯停止UI線程。使用相同的執行方法。

當這一切完成你準備畫一個圖...(我想是你在說什麼)

有一個默認視圖負載啓動,上面寫着「加載計算之前... 「 管他呢。當準備好顯示計算出來的東西並準備好繪製時,將其設置爲可見狀態時,可以看到另一個不可見的視圖。

+0

謝謝你的回答!我認爲這是行得通的。我已經實現了一個AsyncTask來獲取當前位置。我只是在自定義視圖的可見性方面遇到問題。即使我將xml文件中的可見性設置爲「不見了」,它仍然可見。 – Lyte

+0

嗯。在你的自定義視圖中,你是否重寫父類方法'setVisibility(...)'而不是調用'super.setVisibility(...)'? – AnxGotta

+0

不,我嘗試過但它沒有工作...我現在嘗試了其他的東西。我在我的Activity中創建了View的引用,並在AsyncTask中創建了View的引用。 AsyncTask的構造函數使用活動中視圖的引用初始化對視圖的引用。然後我嘗試在我的onPostExecute()方法的參考上調用postInvalidate(),但我仍然得到一個NullPointerException。 :/ – Lyte

相關問題