アプリがインターネットから情報をダウンロードするなどの長いプロセスを実行すると、アプリを読み込む前にスプラッシュ画面が表示され、アプリが完全に読み込まれるとメインページが表示されることがわかっています。スプラッシュスクリーンアクティビティでは、アプリを読み込む前に黒い画面が表示されないように、スレッドで長いプロセスを読み込む必要があります。私はそれらをすべてやりました。アプリを表示する前に黒い画面も表示されます。これは、スプラッシュスクリーンアクティビティの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);
}
}
OK、長い話です。今、質問はこれです。本当にこの黒い画面の根本的な原因は何ですか。これは、スプラッシュアクティビティまたはアプリケーションクラスからのものですか。そして、どのようにそれを解決し、これを示す形を避けることができますか?
マニフェストファイルのアプリケーションタグに使用している背景のテーマを追加して、黒い画面が描画されないようにします。
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"
>
....
表示されるこの初期画面は、「プレビュー」画面と呼ばれます。これをテーマで宣言することにより、これを完全に無効にできます。
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/
AndroidManifest.xml
のこの行をランチャーアクティビティに追加します。
Android:theme="@Android:style/Theme.Translucent.NoTitleBar.Fullscreen
このバグは、画像をブラシ(色)に変換することで解決できます。
次のように、新しいファイルxml(splash_bg.xml)ファイルをdrawableフォルダーに追加します。
<?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
この問題を回避するためのより良い解決策は、AsyncTaskを使用することです。これは、ListActivityの1つで使用するサンプルコードです。
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"));
}
OnCreateで「重いコード」を呼び出すと、読み込みが完了するまで画面が黒く表示されます。 AsyncTaskの使用を検討し、onCreateハンドルをsetContentViewなどにし、AsyncTaskハンドルを「重いコード」にすることができます。
考えてみてください。多分あなたはしないでくださいアプリケーションでかなりの初期化遅延があります;実際には、インスタントランサービスの待機.
私が経験したことから、この症状は、アプリケーションが初期化中に長い黒い画面を表示することですが、デバッグすると、Application
/Activity
's onCreate
メソッドはまだ表示されていますが、まだ呼び出されていません。