Pantalla negra antes de que aparezca la pantalla de bienvenida en Android

Sabemos que cuando la aplicación realiza un proceso largo, como la descarga de cierta información de Internet, puede mostrar una pantalla de inicio antes de cargar la aplicación y cuando la aplicación se carga por completo mostrará la página principal. En la actividad de la pantalla de presentación, debemos cargar procesos largos en subprocesos para evitar mostrar una pantalla negra antes de cargar la aplicación. Yo los había hecho todos. pero también aparece la pantalla en negro antes de mostrar la aplicación. Este es mi método onCreate de la actividad de la pantalla de presentación:

protected override void OnCreate (Bundle bundle) { try { base.OnCreate (bundle); //_dt = DateTime.Now.AddSeconds (_splashTime); SetContentView (Resource.Layout.Splash ); FirstLoadPB= FindViewById (Resource .Id.FirstLoadPB ); FirstLoadingInfo= FindViewById (Resource .Id.FirstLoadInfo ); LoadApplication (); } catch (System.Exception ex) { Common.HandleException (ex); } } 

y este es el código del método LoadApplication :

 public void LoadApplication() { new System.Threading.Thread (new ThreadStart (() => { //Some Codes to load applications- Downloading from web and accessing the storage(Because was many codes - about 100 line- i was clear them. } ) ).Start (); } 

No entiendo por qué aparece la pantalla en negro y cómo evitar esto ahora. Tengo algún código que acceda al almacenamiento en oncreate de mi clase de aplicación. Tal vez la causa raíz del problema sea a partir de ahí. Por lo tanto, he compartido su código:

 public override void OnCreate () { try { base.OnCreate (); _typeOfShow = new MapViewType (); ListingTypes = new Dictionary (); OfflineMode =false; PropertyShowWasShown = false; MeasutingUnitsChanged =false; if(RplXmlSettings .Instance .getVal (AppConstants .XmlSettingShowOnCurrentLocationKey )== "True") typeOfShow .ShowOnCurrentLocation =true ; else typeOfShow .ShowOnCurrentLocation =false; //StorageClass .ctx = ApplicationContext ; FillDashboardOnResume =false; //initlize image loader ImageLoader = Com.Nostra13.Universalimageloader.Core.ImageLoader.Instance; Options = new DisplayImageOptions.Builder () .ShowImageForEmptyUri (Resource.Drawable.ic_tab_map) .CacheOnDisc () .CacheInMemory () .ImageScaleType (ImageScaleType.InSampleInt) .BitmapConfig (Bitmap.Config.Rgb565) .Displayer (new FadeInBitmapDisplayer (300)) .Build (); ImageLoaderConfiguration config; ImageLoaderConfiguration .Builder builder =new ImageLoaderConfiguration .Builder (ApplicationContext).ThreadPoolSize (3); if(RplXmlSettings .Instance .getVal (AppConstants .XmlSettingMemoryCacheKey )== "True") builder .ThreadPriority (4).MemoryCacheSize (1500000) ;// 1.5 Mb builder . DenyCacheImageMultipleSizesInMemory (). DiscCacheFileNameGenerator (new Md5FileNameGenerator ()). MemoryCache (new WeakMemoryCache()). DiscCacheSize (15000000); config = builder .Build (); ImageLoader.Init (config); } catch (Exception ex) { Common .HandleException (ex); } } 

OK. Larga historia. Ahora la pregunta es esta– Realmente, ¿cuál es la causa raíz de esta pantalla negra? Es esto de la actividad de bienvenida o de la clase de aplicación. ¿Y cómo podemos resolverlo y evitar que la forma muestre esto?

Agregue un tema con el fondo que está utilizando a su etiqueta de aplicación en el archivo de manifiesto para evitar que se dibuje la pantalla negra.

theme.xml

      

AndroidManifest.xml

 ....  .... 

Lea por qué hay una pantalla negra aquí Durante el lanzamiento de la aplicación, Android muestra una ventana de vista previa simple (según su tema de actividad) como respuesta inmediata a la acción del usuario. A continuación, la ventana de vista previa se fundirá con su interfaz de usuario real, una vez que se haya cargado por completo. Para garantizar una transición visual fluida, su tema de actividad debe coincidir con su UI completa lo más cerca posible. La imagen de abajo muestra cómo la experiencia puede ser discordante si no se maneja correctamente.

Esta pantalla inicial que ves se llama pantalla “Vista previa”. Puede desactivar esto completamente al declarar esto en su tema:

 android:windowDisablePreview  

Una explicación de cómo manejar esta pantalla se publica aquí: http://cyrilmottier.com/2013/01/23/android-app-launching-made-gorgeous/

Agregue esta línea en su AndroidManifest.xml a la actividad del iniciador:

android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen

Puede resolver este error convirtiendo la imagen como un pincel (color).

Agregue un nuevo archivo xml (splash_bg.xml) en la carpeta dibujable, así.

          

Ahora agregue un nuevo estilo y aplique splash_bg.xml como color de fondo.

  

Aplique este nuevo estilo a su actividad de inicio principal o pantalla de inicio.

 [Activity(Label = "label", MainLauncher = true, Theme = "@style/Theme.SplashBg")] public class SplashScreenActivity : Activity 

Si llama a algún “código pesado” en Crear, la pantalla aparecerá en negro hasta que termine de cargarse. Puede considerar usar AsyncTask y hacer que el manejador de onCreate setContentView, etc., haga que AsyncTask maneje “el código pesado”.

la mejor solución para evitar este problema es usar AsyncTask, aquí hay un código de muestra que utilizo en una de mis ListActivity:

  private class YoutubeTask extends AsyncTask { protected void onPreExecute() { super.onPreExecute(); mLoadingProgress.startAnimation(mDisappear); mLoadingProgress.setVisibility(View.GONE); showDialogProgress(); } protected String doInBackground(URL... url) { youtubeData = VersionParser.readFromUrl(url[0]);; try { JSONObject jsono = new JSONObject(youtubeData); JSONObject feed = jsono.getJSONObject("feed"); JSONArray entry = feed.getJSONArray("entry"); for(int i = 0 ; i < entry.length() ; i++ ){ JSONObject item = entry.getJSONObject(i); JSONArray AUTHOR = item.getJSONArray(TAG_AUTHOR); JSONObject Author = AUTHOR.getJSONObject(0); JSONObject author = Author.getJSONObject("name"); String author_name = author.getString(TAG_TITRE); JSONObject Statistics = item.getJSONObject("yt$statistics"); String Views = Statistics.getString(TAG_VIEWS); JSONObject Media = item.getJSONObject("media$group"); JSONObject MediaTitle = Media.getJSONObject("media$title"); String title = MediaTitle.getString(TAG_TITRE); JSONObject DURATION = Media.getJSONObject("yt$duration"); String duration = DURATION.getString(TAG_DURATION); JSONArray Thumbinail = Media.getJSONArray("media$thumbnail"); JSONObject IMAGE = Thumbinail.getJSONObject(0); String image = IMAGE.getString(TAG_CONTENT); String id = image.substring(22,33); map = new HashMap(); map.put(TAG_TITRE , title ); map.put(TAG_ID , id ); map.put(TAG_DURATION , duration ); map.put(TAG_IMAGE , image); map.put(TAG_VIEWS , Views ); map.put(TAG_AUTHOR , author_name); CURRENCY.add(map); } } catch (JSONException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(String result) { dismisDialogProgress(); mListView.setVisibility(View.VISIBLE); mListView.startAnimation(mAppear); mAdapter = new MAdapter(youtubeSearch.this , CURRENCY); mListView.setSelector(R.drawable.home_bg); mListView.setAdapter(mAdapter); } } 

y dentro de onCreate Methode implementar esto:

  @Override public void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT < 11) setTheme(android.R.style.Theme_Black_NoTitleBar); } super.onCreate(savedInstanceState); setContentView(R.layout.main); new YoutubeTask().execute(new URL("https://gdata.youtube.com/feeds/api/videos?q=Adele&max-results=15&v=2&alt=json")); } 

Aquí hay algo de reflexión; tal vez no tenga un retraso de inicialización considerable en su aplicación; de hecho, puede estar esperando el servicio de ejecución instantánea .

Según lo que he experimentado, los síntomas de esto son que su aplicación muestra una pantalla negra larga mientras se inicializa, pero luego de la depuración se encuentra que ninguno de los métodos onCreate de su Application / Activity aún no se ha llamado mientras esté visible.