Android Studio:应用程序运行时出现白色屏幕

Android Studio:应用程序运行时出现白色屏幕,android,android-studio,google-cloud-messaging,splash-screen,Android,Android Studio,Google Cloud Messaging,Splash Screen,我正在开发一个应用程序,当我运行这个应用程序时,我会在启动屏幕之前看到一个白色的屏幕 在启动屏幕上,我在后台创建了数据库,而且我有推送通知注册码。有关推送通知注册,请参阅链接。所以我的闪屏代码如下: public class SplashScreenActivity extends AppCompatActivity { private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000; private Broadc

我正在开发一个应用程序,当我运行这个应用程序时,我会在启动屏幕之前看到一个白色的屏幕

在启动屏幕上,我在后台创建了数据库,而且我有推送通知注册码。有关推送通知注册,请参阅链接。所以我的闪屏代码如下:

public class SplashScreenActivity extends AppCompatActivity {
    private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
    private BroadcastReceiver mRegistrationBroadcastReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash_screen);

        mRegistrationBroadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
                boolean sentToken = sharedPreferences.getBoolean(QuickstartPreferences.SENT_TOKEN_TO_SERVER, false);
                if (sentToken) {
                    // TODO token sent to server
                } else {
                    // TODO show error that token not sent to server
                }
            }
        };

        if (checkPlayServices()) {
            // Start IntentService to register this application with GCM.
            Intent intent = new Intent(this, RegistrationIntentService.class);
            startService(intent);
        }

        InitializeScreen();
    }
    private boolean checkPlayServices() {
        GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance();
        int resultCode = apiAvailability.isGooglePlayServicesAvailable(this);
        if (resultCode != ConnectionResult.SUCCESS) {
            if (apiAvailability.isUserResolvableError(resultCode)) {
                apiAvailability.getErrorDialog(this, resultCode, PLAY_SERVICES_RESOLUTION_REQUEST).show();
            } else {
                Log.i("Splash screen activity", "This device is not supported.");
                finish();
                }
            return false;
        }
        return true;
    }

    @Override
    protected void onPause() {
        LocalBroadcastManager.getInstance(this).unregisterReceiver(mRegistrationBroadcastReceiver);
        super.onPause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        LocalBroadcastManager.getInstance(this).registerReceiver(mRegistrationBroadcastReceiver, new IntentFilter(QuickstartPreferences.REGISTRATION_COMPLETE));
    }

    private void InitializeScreen() {
        new LoadDataBase(SplashScreenActivity.this).execute(SplashScreenActivity.this);
    }

    private class LoadDataBase extends AsyncTask<Context, Void, Void> {
        Context context;

        public LoadDataBase(Context context){
            this.context = context;
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(Context... arg0) {
            // Create data base from assets folder.
            DatabaseHelper databaseHelper = new DatabaseHelper(arg0[0]);
            try {
                databaseHelper.createDataBase();
            } catch (IOException e) {
                e.printStackTrace();
            }
            // Closing the Data base.
            databaseHelper.close();

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            pauseSplashScreen(context);
        }
    }

    public void pauseSplashScreen(final Context context) {
        // New Thread call.
        new Thread() {
            // Running Thread.
            public void run() {
                int count = 0;
                while (count < 5) {
                    try {
                        Thread.sleep(1000);
                    } catch (Throwable e) {
                        e.printStackTrace();
                    }
                    count++;
                }

                Intent intent = new Intent(context, Activity2.class);
                startActivity(intent);
                finish();
            }
        }.start();
    }
}
公共类SplashScreenActivity扩展了AppCompatActivity{
专用静态最终整数播放服务解析请求=9000;
专用广播接收机注册广播接收机;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u启动屏幕);
mrRegistrationBroadcastReceiver=新的BroadcastReceiver(){
@凌驾
公共void onReceive(上下文、意图){
SharedReferences SharedReferences=PreferenceManager.GetDefaultSharedReferences(上下文);
boolean sentToken=SharedReferences.getBoolean(QuickstartPreferences.SENT_TOKEN_到_服务器,false);
如果(sentToken){
//TODO令牌已发送到服务器
}否则{
//TODO显示令牌未发送到服务器的错误
}
}
};
如果(checkPlayServices()){
//启动IntentService以向GCM注册此应用程序。
意向意向=新意向(此,RegistrationEntService.class);
startService(意向);
}
初始化屏幕();
}
私有布尔值checkPlayServices(){
GoogleAppAvailability apiAvailability=GoogleAppAvailability.getInstance();
int-resultCode=apiAvailability.isGooglePlayServicesAvailable(此);
if(resultCode!=ConnectionResult.SUCCESS){
if(apiAvailability.isUserResolvableError(resultCode)){
apiAvailability.getErrorDialog(此、结果代码、播放服务、解析请求)。show();
}否则{
Log.i(“启动屏幕活动”,“不支持此设备”);
完成();
}
返回false;
}
返回true;
}
@凌驾
受保护的void onPause(){
LocalBroadcastManager.getInstance(this).unregisterReceiver(mrRegistrationBroadcastReceiver);
super.onPause();
}
@凌驾
受保护的void onResume(){
super.onResume();
LocalBroadcastManager.getInstance(this.registerReceiver)(mrRegistrationBroadcastReceiver,新的IntentFilter(QuickstartPreferences.REGISTRATION_COMPLETE));
}
私有void InitializeScreen(){
新建LoadDataBase(SplashScreenActivity.this).execute(SplashScreenActivity.this);
}
私有类LoadDataBase扩展异步任务{
语境;
公共加载数据库(上下文){
this.context=上下文;
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
}
@凌驾
受保护的Void doInBackground(上下文…arg0){
//从资产文件夹创建数据库。
DatabaseHelper DatabaseHelper=新的DatabaseHelper(arg0[0]);
试一试{
databaseHelper.createDataBase();
}捕获(IOE异常){
e、 printStackTrace();
}
//关闭数据库。
databaseHelper.close();
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
暂停屏幕(上下文);
}
}
公共void pauseSplashScreen(最终上下文){
//新线程调用。
新线程(){
//运行线程。
公开募捐{
整数计数=0;
同时(计数<5){
试一试{
睡眠(1000);
}捕获(可丢弃的e){
e、 printStackTrace();
}
计数++;
}
意向意向=新意向(上下文,Activity2.class);
星触觉(意向);
完成();
}
}.start();
}
}
问题是:在启动屏幕之前,我在应用程序启动时会出现白色屏幕,这可能是因为上面链接中给出了推送通知注册


我该怎么做才能避免出现白色屏幕。请指导我。

您正在使用私有内部类创建数据库。从那里你可以调用pauseSplashScreen(上下文)。然后开始一个新的线程?为什么?

我建议给异步任务它自己的类一个接口,以便向调用活动返回信号

如果你使用

Intent intent = new Intent(context, Activity2.class);
startActivity(intent);
您不必调用finish(),该调用最好用于完成当前活动并返回上一个活动。(我让你使用一个线程来阻止其余应用程序的运行,让该线程返回给你,然后转到下一个活动不是更好吗?)


因此,为了回答您的问题,我猜启动活动需要一些时间,您看到的是加载的blanc布局。

这只是因为您使用的是调试版本,当您更改为发布版本时,它将消失。不要对此感到奇怪

我删除了整个数据库创建代码并暂停了Flash屏幕。只保留推送通知注册码,那么同样的事情也会发生……这可能是问题所在吗?否则:是否使用调试器?或者将推送通知注册码移动到onResume()?