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);
    }

}
4

3 に答える 3

3

通常のデスクトップブラウザでURLを開こうとしたところ、ダウンロードする必要のあるものが最終的にダウンロードされるまで、しばらくの間何も表示されませんでした。したがって、遅延の問題があります。

Webビューは奇妙な獣です。HTML(またはあなたの場合は外部URL)を指定すると、loadUrl呼び出しからほぼすぐに返されます。次に、別のスレッドで、Webビューが何をレンダリングしたいかを判断し、それをレンダリングします。したがって、loadURL()呼び出しが戻ってから、画面が実際に更新されるまでに遅延が生じることがよくあります。私のアプリでは、HTML / CSSがすべて1つの文字列に含まれているため、「ダウンロード」の遅延はありませんが、画面の表示とWebビューのレンダリングの間に知覚可能な遅延が発生する可能性があります。

また、サイトにはダウンロードの遅延があり、Webビューの自然な遅延に追加されているようです。Webビューが表示されているようですが、まだ表示するものがないため、空白/白い画面をレンダリングしてから、外部WebサイトからHTML /をダウンロードし、表示されるまで空白の画面を表示します。次のアクティビティがonPageFinished()Webビュークライアントメソッドを介して呼び出される場合を除いて、すべてがダウンロードされ、画面に何かをレンダリングする準備が整います。

UIスレッドは、スレッドに影響を与える別のUIが実行されている(次のアクティビティの開始)ことを認識しているようです。したがって、画面が上書きされることを認識して、実際には画面を更新しません。したがって、新しいアクティビティがonCreate()、onStart()などの一連の呼び出しを開始および終了して、最終的に画面を更新している間、画面は空白/白のままになります。

したがって、スプラッシュ画面は表示されません。次のアクティビティが画面を制御するため、Webビューは画面を更新する機会がありません。

残念ながら、あなたのアプローチには欠陥があると思います。アプローチを2つに分割する方が良いと思います。スプラッシュ画面に非常に単純なものをロードしてから、バックグラウンドスレッドでデータのダウンロードを実行します。すべてが完了したら、バックグラウンドスレッドにセカンダリアクティビティを呼び出させます。理想的には、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 に答える