android - por - pantalla negra s5
Pantalla negra antes de que aparezca la pantalla de bienvenida en Android (7)
Agregue esta línea en su AndroidManifest.xml
a la actividad del iniciador:
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen
Sabemos que cuando la aplicación realiza un proceso largo, como la descarga de información de Internet, puede mostrar una pantalla de bienvenida 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 inicio, debemos cargar procesos largos en subprocesos para evitar mostrar la pantalla en negro 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 inicio:
protected override void OnCreate (Bundle bundle)
{
try {
base.OnCreate (bundle);
//_dt = DateTime.Now.AddSeconds (_splashTime);
SetContentView (Resource.Layout.Splash );
FirstLoadPB= FindViewById <ProgressBar >(Resource .Id.FirstLoadPB );
FirstLoadingInfo= FindViewById <TextView >(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 debo evitar esto ahora. Tengo algunos códigos que acceden al almacenamiento en oncreate de mi clase de aplicación. Quizás la causa raíz del problema sea de allí. Por lo tanto, compartí su código:
public override void OnCreate ()
{
try {
base.OnCreate ();
_typeOfShow = new MapViewType ();
ListingTypes = new Dictionary<int,ListingTypeItem> ();
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 corta. Ahora la pregunta es esta: ¿Cuál es realmente la causa raíz de esta pantalla negra? Es esto de la actividad splash 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 en negro.
theme.xml
<resources>
<!-- Base application theme is the default theme. -->
<style name="Theme" parent="android:style/Theme" />
<style name="Theme.MyAppTheme" parent="Theme">
<item name="android:windowNoTitle">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowBackground">@drawable/my_app_background</item>
</style>
</resources>
AndroidManifest.xml
....
<application
android:name="@string/app_name"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.MyAppTheme"
>
....
Aquí hay algo para pensar; quizás no tenga un retraso de inicialización considerable en su aplicación; de hecho, podría estar esperando el servicio de ejecución instantánea .
Por lo que he experimentado, los síntomas de esto son que su aplicación muestra una pantalla negra larga mientras se inicializa, pero al depurar se encuentra que ninguno de los métodos onCreate
de su Application
/ Activity
tiene que llamarse incluso mientras está visible.
Esta pantalla inicial que se ve se llama la pantalla "Vista previa". Puedes deshabilitarlo completamente declarando esto en tu tema:
android:windowDisablePreview
<style name="Theme.MyTheme" parent="android:style/Theme.Holo">
<!-- This disables the black preview screen -->
<item name="android:windowDisablePreview">true</item>
</style>
Una explicación de cómo manejar esta pantalla se publica aquí: http://cyrilmottier.com/2013/01/23/android-app-launching-made-gorgeous/
Puedes resolver este error convirtiendo la imagen como un pincel (color).
Agregue un nuevo archivo xml (splash_bg.xml) en la carpeta dibujable, como esto.
<?xml version="1.0" encoding="utf-8" ?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<color android:color="@color/splash_bg_color"/>
</item>
<item>
<bitmap
android:src="@drawable/splash_screen"
android:tileMode="disabled"
android:gravity="center"/>
</item>
</layer-list>
Ahora agregue un nuevo estilo y aplique splash_bg.xml como color de fondo.
<style name="Theme.SplashBg" parent="android:Theme">
<item name="android:windowBackground">@drawable/splash_bg</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowContentOverlay">@null</item>
</style>
Aplica este nuevo estilo a tu 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 onCreate, la pantalla aparecerá en negro hasta que termine de cargarse. Podría considerar usar AsyncTask y hacer que el control de onCreate sea setContentView, etc., y hacer que el control de AsyncTask sea "el código pesado".
la mejor solución para evitar este problema es usar AsyncTask, aquí hay un código de ejemplo que uso en uno de mi ListActivity:
private class YoutubeTask extends AsyncTask<URL, Integer, String> {
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<String, String>();
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 del metodo de onCreate implementa 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"));
}