3

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

这是代码;
飞溅.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>


飞溅.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);
    }

}
4

3 回答 3

3

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

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

而且您的网站似乎有一个下载延迟,以增加网络视图的自然延迟。我怀疑 web 视图正在变得可见,它还没有任何东西可以显示,所以呈现一个空白/白色屏幕,然后从外部网站下载 HTML/任何内容,仍然显示一个空白屏幕,直到它有除了通过 onPageFinished() Web 视图客户端方法调用下一个活动之外,所有下载的内容都已准备好在屏幕上呈现某些内容。

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

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

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

这样用户会看到一些东西,然后在用户欣赏你的启动画面时在后台发生其他事情。

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

于 2012-04-05T01:59:08.890 回答
0

我认为setContentView(R.layout.main)线路onResume可能会导致问题。您已经在调用setContentView(R.layout.splash)onCreate因此您无需再次调用它onResume。不确定您的 main.xml 是什么样的,但似乎它可能只是一个空白布局。

于 2012-04-05T01:40:32.480 回答
0

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

于 2012-04-05T01:43:01.053 回答