2011-04-03 92 views
1

我已閱讀關於主題的fewposts。這是我的策略;我有一個繪圖應用程序,它在ListView中顯示用戶創建的圖形。一旦用戶選擇了圖中,DrawingEdit活動被激發起來,用圖中的onCreate被加載,大致如下:Android:將圖像閃爍到其他屏幕顯示內容正在加載

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // set the layout for the activity 
setContentView(R.layout.drawing_view); 

    // do potentially expensive loading of drawing here 
    loadDrawing(); 
} 

loadDrawing()加載用戶的繪圖的各個形狀從一個數據庫。現在,對於95%的圖紙以及「典型」用例,這可以很好地工作,因爲「活動」加載速度很快,幾乎沒有延遲。但是,對於非常非常複雜的圖紙,延遲時間可能長達兩秒。爲了幫助解決這個問題,我嘗試了一個AsyncTask,它適用於5%過大的圖紙,但對於其他95%的圖片看起來像是矯枉過正,實際上使得加載速度稍慢一些,因爲必須點火啓動AsyncTask。這不是最糟糕的解決方案,但我正在尋找替代品。

現在,除了我已經存儲在數據庫中的繪圖數據之外,我還可以使用靜態PNG版本的繪圖...所以我想要使用的解決方案是沿着線:

  1. 負載臨時「閃」屏幕在的onCreate開頭視圖(),使用靜態圖形用作佔位符,用戶能夠立即查看而繪圖加載。
  2. 開始有時很昂貴的loadDrawing()例程。
  3. 完成後,切換視圖並使用包含loadDrawing()形狀的完全交互式繪圖畫布顯示輔助視圖。

我的問題是,如果我的上述解決方案大致如下模式,是永遠不會顯示「飛濺」的佈局,且仍有相同的延遲,直到loadDrawing()完成,然後顯示最終佈局。有關這裏發生的事情的任何信息?我應該將loadDrawing()移動到onResume,以便在觸發loadDrawing()之前初始啓動UI有機會加載?

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // set the layout for the activity 
setContentView(R.layout.splash_view); 

    // do potentially expensive loading of drawing here 
    if (loadDrawing()) { 
     // set the layout for the activity 
    setContentView(R.layout.drawing_view); 
    } 
} 

回答

0

如果loadDrawing是Activity中的一個方法,它將阻塞UI線程直到它完成。簡而言之,直到啓動步驟(創建/開始/恢復)完成後纔會顯示UI。如果您將loadDrawing放入onResume中,則無關緊要,因爲它仍會阻止用戶界面的創建。

您需要使用某種背景異步線程才能使其發揮作用 - 這就是爲什麼AsyncTask有助於在需要同時發生其他事情時才能繪製/操作UI的原因。

+0

嗯,好的,完美的,當用戶界面被繪製的時候並不是100%的確定的,這就涵蓋了它,謝謝。 – 2011-04-04 02:14:44

+0

@Paul:很高興幫助,不得不承認,當第一次抓住活動和UI線程時,它讓我感到困惑。 – Squonk 2011-04-04 12:48:55