2012-10-23 55 views
7

在將視圖切換到該活動之前是否可以在後臺加載新活動?在顯示它之前在後臺加載活動

例如,我想要一個斜槓屏幕活動被調用並顯示一個啓動畫面。在顯示此啓動畫面時,會加載下一個活動,並在完成加載時(完成onCreate()時),啓動畫面活動結束,並顯示新活動。

我知道另一個選擇是在新的活動中顯示啓動畫面,並使用異步任務來加載所有的數據,然後刪除閃屏圖像......但我也被困在這種方法中。該活動首先必須加載相當數量的數據,然後必須基於該數據動態添加GUI元素。一旦GUI完全加載,然後我想要刪除啓動畫面。問題是我無法觸摸doInBackground()中的UI線程。如果我無法從doInBackground更新UI,如何在啓動屏幕後創建我的活動?我知道onProgressUpdate()可以訪問UI線程,但我無法弄清楚如何實現它。

任何想法?謝謝!

回答

5

由於你沒有你的代碼的例子,我不知道你正在加載什麼樣的數據,以及如何根據數據動態地配置UI,但我會盡量回答我可以。結果,答案可能聽起來有點通用。

首先,定義2個佈局xml文件 - 一個用於啓動畫面,另一個用於「主」活動。 所以你會/res/layout/splash_screen.xml結束和/res/layout/main.xml

在你的onCreate(),加載splash_screen佈局:

setContentView(R.layout.splash_screen); 

在您的異步任務,你將加載你需要做的任何數據,並且你將把所有的數據保存在某種數據結構中。例如,我會使用String的LinkedList。

private class MyTask extends AsyncTask<Uri, Integer, List<String>> { 

    @Override 
    protected List<String> doInBackground(Uri... params) { 
     List<String> myList = new LinkedList<String>(); 
     // load up the list with data you are trying to get 
     myList.add("foo"); 
     myList.add("bar"); 
     // whatever you return here will be passed in as a parameter to the onPostExecute() 
     return myList; 
    } 

    @Override 
    protected void onPostExecute(List<String> result) { 
     setContentView(R.layout.main2); 
     // set layout elements with data that from the result 
     TextView myTextView = (TextView) findViewById(R.id.some_label); 
     myTextView.setText(result.get(0)); 
     // or just call some function you defined in your activity instead 
    } 
} 

所以基本上,有2個不同的佈局文件,並使用splash_screen佈局,並使用異步任務負載的數據並將其保存在您定義的一些數據結構,並使用該數據結構來加載UI元素在使用setContentView()更改回主佈局之後,在onPostExecute()中。

一個特別注意事項: 使用上面的代碼,它將再次顯示啓動畫面,如果旋轉屏幕,將重新載入所有數據。如果您想避免這種情況,您可以使用onSaveInstanceState()並將所需的任何數據保存到outBundle中,並將該數據讀回到onCreate的savedInstanceState捆綁包中並加載UI元素。如果你想知道更多關於處理旋轉的信息,這將需要一個單獨的線程(或者你可以搜索它)。

+0

對不起,我無法提供任何代碼,因爲我已簽署了禁止我共享代碼的NDA。儘管我可以談論一般性問題。我基本上根據條件加載了一個xml,並且該xml文件告訴我需要顯示哪些圖像以及與該圖像關聯的信息。我會從返回的圖像列表中動態創建圖像視圖,並將它們添加到視圖中。在屏幕上出現所有內容(包含大量圖片)之前,需要花費2-3秒鐘,因此我希望顯示一個閃屏,直到所有內容都已加載並準備好與之交互爲止。 – romamnmlst

+0

在這種情況下,我認爲您可以在上面的doInBackground()函數中解析XML文件,創建ImageView並設置圖像源,並從doInBackground()函數返回ImageView列表。 onPostExecute()函數將獲取ImageView的列表,並將它們添加到setContentView()之後的視圖層次結構中。您在onPostExecute()中執行的任何操作都在主線程中運行,因此您可以從此處修改UI元素。 – hiBrianLee

+0

非常好,我會給你一個鏡頭,看看它是如何工作的。謝謝! (可能需要一段時間,但如果有效,我一定會回來並將您的答案標記爲已接受) – romamnmlst

1

解決您的問題的一個解決方案我能想到的是使用一項活動來顯示啓動畫面和您的內容。由於您可以隨時調用setContentView()方法(不僅在onCreate()方法中),只需在單獨的XML文件中定義所需的所有視圖,並在切換時將相關ID傳遞給setContentView()。

您還可以在視圖和閃屏中使用一種佈局,並隱藏/取消隱藏屬性。當您的數據將setVisibility加載到您的啓動畫面時,您的根視圖將保持不可見狀態。完成加載時 - 以相反的方式完成。

相關問題