1

Android 2.2 (Eclipse エミュレーター) で作業しようとしている 2 つの部分のスプラッシュ スクリーンがあります。すべて 2.3 エミュレーターで動作します。2.2 では頻繁に動作します - 黒い画面になることもあります - エミュレータを再起動する必要があることもあります。画面をクリックしてスプラッシュをキャンセルし、メインのアクティビティに直接移動しようとすると、黒い画面になり、ログに次のように表示されます。

06-29 12:23:54.474: I/ActivityManager(58): Starting activity: Intent { cmp=org.test.game/.MainActivity }
06-29 12:23:54.494: W/System.err(278): java.lang.InterruptedException
06-29 12:23:54.504: D/qemud(37): fdhandler_accept_event: accepting on fd 10
06-29 12:23:54.504: D/qemud(37): created client 0x17fe8 listening on fd 15
06-29 12:23:54.504: D/qemud(37): client_fd_receive: attempting registration for service 'sensors'
06-29 12:23:54.504: D/qemud(37): client_fd_receive:    -> received channel id 11
06-29 12:23:54.514: D/qemud(37): client_registration: registration succeeded for client 11
06-29 12:23:54.524: D/qemud(37): fdhandler_accept_event: accepting on fd 10
06-29 12:23:54.524: D/qemud(37): created client 0x18038 listening on fd 16
06-29 12:23:54.524: D/qemud(37): fdhandler_event: disconnect on fd 15
06-29 12:23:54.544: W/System.err(278):  at java.lang.VMThread.sleep(Native Method)
06-29 12:23:54.554: W/System.err(278):  at java.lang.Thread.sleep(Thread.java:1306)
06-29 12:23:54.554: W/System.err(278):  at java.lang.Thread.sleep(Thread.java:1286)
06-29 12:23:54.564: W/System.err(278):  at org.test.game.Splash$SplashScreenDelay.doInBackground(Splash.java:121)
06-29 12:23:54.574: W/System.err(278):  at org.test.game.Splash$SplashScreenDelay.doInBackground(Splash.java:1)
06-29 12:23:54.584: W/System.err(278):  at android.os.AsyncTask$2.call(AsyncTask.java:185)
06-29 12:23:54.594: W/System.err(278):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
06-29 12:23:54.604: W/System.err(278):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
06-29 12:23:54.604: W/System.err(278):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
06-29 12:23:54.614: W/System.err(278):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
06-29 12:23:54.624: W/System.err(278):  at java.lang.Thread.run(Thread.java:1096)
06-29 12:24:04.475: W/ActivityManager(58): Launch timeout has expired, giving up wake lock!
06-29 12:24:04.484: W/ActivityManager(58): Activity idle timeout for HistoryRecord{44eca1f8 org.test.game/.MainActivity}
06-29 12:24:14.494: W/ActivityManager(58): Activity destroy timeout for HistoryRecord{44ebb9b0 org.test.game/.Splash}

http://webgarbage.de/splash-screen-on-android.htmlに触発されました

import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MotionEvent;
import android.widget.ImageView;

public class Splash extends Activity {

    private AsyncTask splashDelay;
    private ImageView ivSplash;
    private int splashCount = 0;
    private int splashTime = 2;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splashscreen);
        ivSplash = (ImageView) findViewById(R.id.IVSplash);
        splashDelay = new SplashScreenDelay().execute(splashTime);
    }

    //Touch screen to skip splash
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            splashDelay.cancel(true);
        }
        return true;
    }

    private class SplashScreenDelay extends AsyncTask<Integer, Integer, Integer> {

        @Override
        protected Integer doInBackground(Integer... params) {
            try {
                int count = 0;
                while (count < params[0]*10) {
                    if(count % 10 == 0) { 
                        Log.v("Splash", "Sleeping... " + count/10); 
                    }
                    Thread.sleep(100);
                    count++;
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return new Integer(0);
        }

        @Override
        protected void onPostExecute(Integer result) {
            if (splashCount == 0) {
                splashCount = 1;
                ivSplash.setBackgroundResource(R.drawable.splash2);
                splashDelay = new SplashScreenDelay().execute(splashTime); 
            }
            else 
                startActivity(new Intent(getApplicationContext(), MainActivity.class));
        }

        protected void onCancelled() {
            startActivity(new Intent(getApplicationContext(), MainActivity.class));
        }
    }
}

何かアドバイス?スプラッシュをキャンセルすると黒い画面が表示されるのはなぜですか? MainActivity の待機時間が長すぎると「起動タイムアウトの期限が切れました」というエラーが発生することを読みましたが、スプラッシュの動作が中断された場合 (より多くの時間)、キャンセルがある場合 (より短い時間) に失敗するのはなぜですか?

ありがとう

4

1 に答える 1

0

非同期タスクは、スプラッシュ スクリーンにタイマーを設定するのには適していません。より適切な方法は、Handlerと sendDelayed を使用してスプラッシュ画面を遅らせることです。

于 2012-06-30T17:24:29.320 に答える