2012-04-05 94 views
3

基本上我有一個啓動畫面,顯示用戶何時啓動應用程序。初始屏幕應該打開一個網站(稍後會顯示的網站),以便將所有字體和圖像下載到緩存中,以便在您第一次運行該應用程序時使所有內容都更流暢。 但你看到的只是一個白色的屏幕,代碼工作(測試它),但它顯示了一個白色的閃屏,而不是一個帶有徽標和一些文字的白色屏幕。啓動畫面完全白色?

這是代碼;
Splash.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:background="#4A4A4A"> 

    <ImageView 
     android:id="@+id/logo" 
     android:layout_width="200dp" 
     android:layout_height="wrap_content" 
     android:src="@drawable/logo" 
     android:layout_gravity="center" /> 

    <TextView 
     android:text="@string/loading" 
     android:layout_gravity="center" 
     android:textColor="#FFA500" 
     android:textSize="15dp" 
     android:typeface="normal" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

    <WebView 
     android:id="@+id/splashview" 
     android:layout_width="0px" 
     android:layout_height="0px" 
     android:layout_weight="0" /> 

</LinearLayout> 


Splash.java

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.webkit.WebChromeClient; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 

public class Splash extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstance) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstance); 
     setContentView(R.layout.splash); 

     WebView webView = (WebView) findViewById(R.id.splashview); 
     webView.setWebChromeClient(new WebChromeClient()); 

     webView.loadUrl("http://ngmat.site90.net/matsedel/"); 

     webView.setWebViewClient(new WebViewClient() { 
      @Override 
      public void onPageFinished(WebView view, String url) { 
       Intent NGMat = new Intent("android.intent.category.SECONDARY"); 
       startActivity(NGMat); 
      } 
     }); 

    } 

    @Override 
    protected void onPause() { 
     // TODO Auto-generated method stub 
     super.onPause(); 
     finish(); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     setContentView(R.layout.main); 
    } 

} 

回答

0

我認爲setContentView(R.layout.main)onResume可能會造成問題。您已在onCreate中撥打setContentView(R.layout.splash),因此您無需在onResume中再次調用它。不知道你的main.xml是什麼樣的,但似乎它可能只是一個空白的佈局。

+0

我刪除了整個onResume,現在它工作!感謝你及時的答覆。但是現在,每次我啓動應用程序時,它都會顯示啓動畫面。我應該做一個布爾值來檢查飛濺是否已經顯示? – Unidan 2012-04-05 01:43:42

+0

在SharedPreferences中保存一個布爾值是這樣做的一種方式,但正如@Colin所提到的,您不一定知道您已經緩存了正確的數據。例如,如果您在該站點關閉或者沒有連接的情況下加載應用程序,則可能會將標誌設置爲永不顯示啓動畫面,即使它從未緩存過所需的數據。不確定你的用例在這裏的細節,但我只想提一些要考慮的事情。 – Aldryd 2012-04-05 15:06:30

0

也許頁面加載太快? 在開始加載內容之前3-5秒鐘的計時器如何?

3

我剛剛在正常的桌面瀏覽器中嘗試了opening your URL,幾乎沒有任何顯示,直到最後下載需要下載的任何東西。所以有一個延遲問題。

網絡視圖是一個奇怪的野獸。在我看來,你給它HTML(或在你的情況下一個外部URL),它幾乎立即從loadUrl調用返回。然後在另一個線程中,Web視圖會找出它想要呈現的內容,然後呈現它。因此,在loadURL()調用返回和實際更新屏幕之間通常會有延遲。在我的應用程序中,我將HTML/CSS全部放在一個字符串中,因此沒有「下載」延遲,但屏幕顯示和Web視圖呈現之間仍然存在明顯的延遲。

而您的網站似乎有一個下載延遲,以添加到網絡視圖的自然延遲。我懷疑Web視圖是可見的,它沒有任何東西可以顯示,所以呈現一個空白/白色屏幕,然後從外部網站下載HTML /任何東西,仍然顯示一個空白屏幕,直到它有下載所有內容並準備在屏幕上顯示內容,除非您的下一個活動是通過onPageFinished()Web視圖客戶端方法調用的。

UI線程似乎發現另一個影響線程的UI正在運行(下一個活動的開始),因此不會實際更新屏幕,因爲它知道它將被覆蓋。因此,當新活動啓動並完成其onCreate(),onStart()等調用序列以最終更新屏幕時,屏幕保持空白/白色。

因此,你永遠不會看到你的啓動畫面。 Web視圖沒有機會更新屏幕,因爲下一個活動需要控制屏幕。

不幸的是我認爲你的方法有缺陷。我認爲將這種方法分成兩部分會更好 - 使用一些非常簡單的方法加載啓動畫面,然後在後臺線程上導致數據下載發生。讓後臺線程在完成所有事情時調用次要活動,理想情況是通過發送對UI線程的調用來切換到下一個活動。

這樣用戶就會看到一些東西,然後在用戶欣賞你的啓動畫面時,在後臺發生其他的事情。

是否可以將啓動畫面內容嵌入到應用程序的下載/安裝包中,以便它始終快速顯示而不受數據連接的存在或其速度的影響?通常,應用程序會有一個簡單的啓動畫面「燒入」已安裝的軟件包,以便無論設備是否能夠到達本身以外,都可以顯示某些內容。

+0

嘿。感謝你的回答!現在,啓動畫面顯示爲我想要的,它實際上緩存了網頁內容,但在飛濺之後顯示了0.5秒的白色屏幕,但我可以忍受這一點..現在我的問題是每次顯示啓動畫面即使內容已被緩存,應用程序也會被打開,所以我試圖弄清楚該怎麼做。我在考慮'SharedPreferences',需要先閱讀更多關於它的內容。 – Unidan 2012-04-05 02:11:41

+0

一旦從外部Web服務器獲得了足夠的信息以實現其所需的數據,該應用程序將只知道緩存的內容是正確的內容。你知道這個URL是一個重複的URl,它後面的內容沒有改變,但是webview沒有改變 - 它必須與你的外部Web服務器進行交互來弄清楚,這可能需要一點時間,特別是如果服務器或數據網絡(延遲)很慢。 – Colin 2012-04-05 02:17:59