2

私はアプリを実行するときにスプラッシュ画面の前に白い画面が表示されるアプリケーションを開発しています。Androidスタジオ:アプリ実行時の白い画面

スプラッシュ画面では、バックグラウンドでデータベースを作成しました。プッシュ通知登録コードを持っています。プッシュ通知登録については、thisリンクを参照してください。以下のようにスプラッシュスクリーンコードの私のコードは次のとおりです。

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

問題がある:私はスプラッシュ画面前に、アプリの起動時に白い画面を取得していますし、それは上記のリンクで与えられた通知登録をプッシュする予定であるかもしれません。

白い画面が表示されないようにするにはどうすればよいですか。私を案内してください。

答えて

0

プライベート内部クラスを使用してデータベースを作成しています。そこから、pauseSplashScreen(コンテキスト)を呼び出します。それは新しいスレッドを開始しますか?どうして?

自分の呼び出しアクティビティに信号を戻すためのインターフェイスを持つ非同期タスクを与えることをお勧めします。あなたは

Intent intent = new Intent(context, Activity2.class); 
startActivity(intent); 

を使用する場合

あなたは()仕上げを呼び出す必要はありません、その呼び出しは、より良い現在の活動を終了し、戻って、以前のものに取得するために使用されます。 (私はスレッドを使って残りのアプリケーションをブロックしないようにしていますが、スレッドがあなたに戻り、次のアクティビティに移動するのは良いのですか?)

質問に答えるために、私の推測では、あなたのアクティビティのスタートアップには時間がかかり、あなたが見るのはブランクレイアウトです。

+0

データベース全体の作成コードを削除し、一時停止画面を削除しました。プッシュ通知登録コードだけを保持すると、同じことが起こります... –

+0

これは問題になるかもしれませんか? http://stackoverflow.com/questions/36575229/android-studio-2-0-pause-white-screen-on-app-first-run?rq=1 それ以外の場合:デバッガを使用しますか?プッシュ通知登録コードをonResume()に移動しますか? – Flummox

0

あなたがデバッグバージョンを使用しているという理由だけで、リリースバージョンに変更すると、それについては心配しないでください!

関連する問題