飞溅屏幕完全白色?

时间:2012-04-05 01:34:25

标签: android screen splash

基本上我有一个启动画面,显示用户启动应用程序的时间。启动画面应该打开一个网站(将在稍后显示的网站)下载所有字体和图像以缓存,以使第一次运行应用程序时一切运行更顺畅。 但是你所看到的只是一个白色的屏幕,代码工作(测试它),但它显示一个白色的闪屏,而不是一个带有徽标和一些文字的屏幕。

这是代码;
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);
    }

}

3 个答案:

答案 0 :(得分:3)

我只是在普通的桌面浏览器中尝试了opening your URL,并且在相当长的时间内几乎没有显示任何内容,几乎直到最终下载了需要下载的内容。所以存在延迟问题。

网络视图是一个奇怪的野兽。在我看来,你给它HTML(或在你的情况下是一个外部URL),它几乎立即从loadUrl调用返回。然后在另一个线程上,Web视图会确定要呈现的内容,然后呈现它。因此,loadURL()调用返回和屏幕实际更新之间经常会有延迟。在我的应用程序中,我将HTML / CSS全部放在一个字符串中,因此没有“下载”延迟,但仍然可以在屏幕显示和Web视图呈现之间出现明显的延迟。

您的网站似乎有下载延迟,以添加到网络视图的自然延迟。我怀疑Web视图是可见的,它没有任何东西可以显示,所以渲染一个空白/白色屏幕,然后从外部网站下载HTML /任何东西,仍然显示一个空白屏幕,直到它有下载了所有内容,并准备好在屏幕上呈现内容,但通过onPageFinished()Web视图客户端方法调用下一个活动。

UI线程似乎弄清楚另一个影响线程的UI正在运行(下一个活动的开始),因此实际上并没有更新屏幕,因为它知道它无论如何都会被覆盖。因此,当新活动开始时,您的屏幕保持空白/白色,并完成其onCreate(),onStart()等调用序列,最终更新屏幕。

因此,你永远不会看到你的闪屏。 Web视图没有机会更新屏幕,因为下一个活动控制了屏幕。

不幸的是,我认为你的方法存在缺陷。我认为最好将方法拆分为两个 - 用简单的东西加载启动画面,然后在后台线程导致数据下载发生。让后台线程在完成所有操作后调用辅助活动,最好是通过调用UI线程切换到下一个活动。

通过这种方式,用户可以看到某些内容,然后在后台,当用户欣赏启动画面时,会发生其他事情。

您是否可以将启动画面内容嵌入应用程序的下载/安装包中,以便始终快速显示,而不受数据连接或速度的影响?通常,应用程序会有一个简单的启动画面“烧入”已安装的软件包,这样无论设备是否能够到达外部,它们都可以显示。

答案 1 :(得分:0)

我认为setContentView(R.layout.main)中的onResume行可能会导致问题。您已在setContentView(R.layout.splash)中呼叫onCreate,因此您无需再次在onResume中再次呼叫它。不确定你的main.xml是什么样的,但看起来它可能只是一个空白的布局。

答案 2 :(得分:0)

也许页面加载太快了? 在开始加载内容之前3-5秒计时器怎么样?