Подтвердить что ты не робот

Черный экран перед тем, как заставка появится в Android

Мы знаем, что когда приложение делает какой-то длительный процесс, например, загружая некоторую информацию из Интернета, он может показать заставку перед загрузкой приложения, и когда приложение будет загружено полностью, оно отобразит главную страницу. В активности заставки мы должны загружать длинные процессы в потоках, чтобы не показывать черный экран перед загрузкой приложения. Я сделал все. но перед тем, как показывать приложение, появится черный экран. Это мой метод onCreate активности заставки:

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

и это код метода 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 ();
    }

Я не понимаю, почему появляется черный экран и как следует избегать этого. У меня есть код, доступ к хранилищу в oncreate моего класса приложения. Может быть, причина в том, что проблема может быть оттуда. Поэтому я поделился своим кодом:

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

    }

ОК. Поздняя история. Теперь вопрос в том, что - На самом деле, что является основной причиной этого черного экрана. Это от активности всплеска или от класса приложения. И как мы можем это решить и избегать формы, показывающей это?

4b9b3361

Ответ 1

Добавьте тему с фоном, который вы используете в свой тег приложения в файле манифеста, чтобы не нарисовать черный экран.

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"
         >
....

Читайте, почему здесь есть черный экран On app launch, Android displays a simple preview window (based on your activity theme) as an immediate response to the user action. Then the preview window crossfades with your actual UI, once that has fully loaded. To ensure a smooth visual transition, your activity theme should match your full UI as closely as possible. The below image shows how the experience can be jarring if not handled properly.

Ответ 2

Этот начальный экран, который вы видите, называется экраном предварительного просмотра. Вы можете полностью отключить это, объявив это в своей теме:

android:windowDisablePreview

<style name="Theme.MyTheme" parent="android:style/Theme.Holo">
    <!-- This disables the black preview screen -->
    <item name="android:windowDisablePreview">true</item>
</style>

Объяснение того, как обращаться с этим экраном, опубликовано здесь: http://cyrilmottier.com/2013/01/23/android-app-launching-made-gorgeous/

Ответ 3

Добавьте эту строку в свой AndroidManifest.xml к Launcher Activity:

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

Ответ 4

Если вы назовете какой-то "тяжелый код" в onCreate, экран появится черным до тех пор, пока он не будет загружен. Вы можете рассмотреть использование AsyncTask и сделать обработчик onCreate setContentView и т.д. И сделать дескриптор AsyncTask "тяжелым кодом".

Ответ 5

лучшим решением для избежания этой проблемы является использование AsyncTask, вот пример кода, который я использую в одном из своих 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);

             } 
    }

и внутри метода onCreate Methode выполните следующее:

            @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"));
        }

Ответ 6

Вы можете решить эту ошибку, преобразуя изображение в кисть (цвет).

Добавьте новый файл xml (splash_bg.xml) в папку для переноса, например.

<?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>

Теперь добавьте новый стиль и примените splash_bg.xml в качестве цвета фона.

<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>

Применить этот новый стиль к основной активности запуска или заставки.

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

Ответ 7

Здесь есть пища для размышлений; возможно, у вас вообще нет значительной задержки инициализации в вашем приложении; вы действительно можете быть в ожидании службы мгновенного запуска.

Из того, что я испытал, это говорит о том, что ваше приложение показывает длительный черный экран во время инициализации, но после отладки вы обнаружите, что ни один из ваших методов Application/Activity onCreate еще не получил быть вызванным, пока оно видимо.