android中出现闪屏前的黑屏
我们知道,当应用程序执行一些长过程时,比如从互联网下载一些信息,它可能会在加载应用程序之前显示一个启动屏幕,当应用程序完全加载时,它将显示主页。 在启动屏幕活动中,我们必须在线程中加载长进程,以避免在加载应用程序之前显示黑屏。 我都做了。但在显示应用程序之前也会出现黑屏。 这是我启动屏幕活动的onCreate方法:android中出现闪屏前的黑屏,android,xamarin.android,splash-screen,Android,Xamarin.android,Splash Screen,我们知道,当应用程序执行一些长过程时,比如从互联网下载一些信息,它可能会在加载应用程序之前显示一个启动屏幕,当应用程序完全加载时,它将显示主页。 在启动屏幕活动中,我们必须在线程中加载长进程,以避免在加载应用程序之前显示黑屏。 我都做了。但在显示应用程序之前也会出现黑屏。 这是我启动屏幕活动的onCreate方法: protected override void OnCreate (Bundle bundle) { try { base.O
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);
}
}
我不明白为什么会出现黑屏,现在应该如何避免。
我有一些代码可以在创建应用程序类时访问存储。也许问题的根本原因就在那里。因此,我分享了它的代码:
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);
}
}
public重写void OnCreate()
{
试一试{
base.OnCreate();
_typeOfShow=新的MapViewType();
ListingTypes=新字典();
离线模式=假;
PropertyShowwasShowed=false;
MeasutingUnitsChanged=假;
if(RplXmlSettings.Instance.getVal(AppConstants.XmlSettingShowOnCurrentLocationKey)=“True”)
typeOfShow.ShowOnCurrentLocation=true;
其他的
typeOfShow.ShowOnCurrentLocation=false;
//StorageClass.ctx=ApplicationContext;
FillDashboardOnResume=false;
//初始化图像加载程序
ImageLoader=Com.Nostra13.Universalimageloader.Core.ImageLoader.Instance;
选项=新的DisplayImageOptions.Builder()
.ShowImageForEmptyUri(Resource.Drawable.ic\u选项卡\u映射)
.CacheOnDisc()
.CacheInMemory()
.ImageScaleType(ImageScaleType.InSampleInt)
.BitmapConfig(Bitmap.Config.Rgb565)
.显示器(新FadeInBitmapDisplayer(300))
.Build();
ImageLoaderConfiguration配置;
ImageLoaderConfiguration.Builder=新建ImageLoaderConfiguration
.Builder(ApplicationContext).ThreadPoolSize(3);
if(RplXmlSettings.Instance.getVal(AppConstants.XmlSettingMemoryCacheKey)=“True”)
builder.ThreadPriority(4).MemoryCacheSize(1500000);//1.5MB
建设者
DenycacheMageMultipleSizesInMemory()。
DiscCacheFileNameGenerator(新的Md5FileNameGenerator())。
MemoryCache(新的WeakMemoryCache())。
磁盘大小(15000000);
config=builder.Build();
Init(config);
}捕获(例外情况除外){
普通.手例外(ex);
}
}
好的,长话短说。现在的问题是——黑屏的根本原因是什么。这是来自splash活动还是来自应用程序类。我们如何解决它并避免表单显示此问题?如果在onCreate中调用一些“重代码”,屏幕将显示黑色,直到加载完成。您可以考虑使用AsNyCtask并生成OnCudio句柄SETCONTRONTVIEW等,并使AsiCyTask句柄“重代码”。< P>在清单文件中添加一个与您正在使用的应用程序标签相关的主题,以防止绘制黑屏。 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"
>
....
。。。。
避免此问题的更好解决方案是使用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);
}
}
私有类YoutubeTask扩展异步任务{
受保护的void onPreExecute(){
super.onPreExecute();
mLoadingProgress.startAnimation(mDisappear);
mLoadingProgress.setVisibility(View.GONE);
showDialogProgress();
}
受保护的字符串doInBackground(URL…URL){
youtubeData=VersionParser.readFromUrl(url[0]);;
试一试{
JSONObject jsono=新的JSONObject(youtubeData);
JSONObject feed=jsono.getJSONObject(“feed”);
JSONArray entry=feed.getJSONArray(“entry”);
对于(int i=0;i 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);
}
}
@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"));
}
android:windowDisablePreview
<style name="Theme.MyTheme" parent="android:style/Theme.Holo">
<!-- This disables the black preview screen -->
<item name="android:windowDisablePreview">true</item>
</style>
<?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>
<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