2015-05-01 51 views
0

我下載了閃屏例如從Xamarin網站: http://developer.xamarin.com/guides/android/user_interface/creating_a_splash_screen/Xamarin初始屏幕示例在手機的橫向模式下不起作用。如何解決它?

我編譯並運行它在我的手機: http://www.gsmarena.com/samsung_galaxy_fresh_s7390-5841.php

捧在肖像模式(垂直)我的電話時,這是工作的罰款。啓動畫面變爲直接可見,並在幾秒鐘後,該按鈕的視圖變得可見。當關閉並重​​新啓動應用程序時,它仍然正常工作。

之後,我再次關閉它,並將手機保持橫向(水平)模式。現在,我再次開始申請。我的手機凍結了幾秒鐘,飛濺無法看見。之後,我用按鈕看到了我的視角。

當您嘗試重現此問題,請確保您:

  • 不要試圖重現一個虛擬設備(的行爲是不同的)。
  • 確保睡眠至少需要10秒鐘,然後才能真正發現問題所在:凍結的應用程序,而不是閃屏。
  • 如果您沒有Samsung Trend Lite,可以在另一臺小巧的智能手機上試用。我很難想象這可能是「僅限三星趨勢精簡版」問題。

我該如何解決這個問題?

回答

3

Xamarin sample你掛在其內具有很大的問題:

[Activity(Theme = "@style/Theme.Splash", MainLauncher = true, NoHistory = true)] 
public class SplashActivity : Activity 
{ 
    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 
     Thread.Sleep(10000); // Simulate a long loading process on app startup. 
     StartActivity(typeof(Activity1)); 
    } 
} 

ActivityOnCreate()方法在UI線程,因此調用Thread.Sleep()上執行它裏面會鎖定了主線程,可能產生應用程序不響應(ANR)顯示給用戶。

這是錯的Xamarin文檔,你不應 UI線程上運行Thread.Sleep(),尤其是在覈心的生命週期回調的活動之一。

修復此通過使用一個後臺線程來執行睡眠,然後回調到飛濺活動啓動下一個活動:

[Activity(Theme = "@style/Theme.Splash", MainLauncher = true, NoHistory = true)] 
public class SplashActivity : Activity 
{ 
    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 
     System.Threading.Tasks.Task.Run(() => { 
      Thread.Sleep(10000); // Simulate a long loading process on app startup. 
      StartActivity(typeof(Activity1)); 
     }); 
    } 
} 
+0

你確定,它不應該在UI線程上完成?這也解決了我的設備上的問題(我剛剛發現):base.OnCreate(bundle); System.Timers.Timer t = new System.Timers.Timer(1); t.Elapsed + =(o,e)=> t.Stop(); Thread.Sleep(10000); //在應用程序啓動時模擬一個很長的加載過程。 StartActivity(typeof(Activity1)); }; t.Start(); – Daan

+0

這或多或少與使用後臺線程做同樣的事情。這也是一個不錯的解決方案! – matthewrdev

+0

爲了響應將睡眠放入後臺線程,請嘗試按照Xamarin文檔建議的方式進行操作,並在啓動時按下後退按鈕退出應用程序。因爲它在UI線程上會鎖定用戶交互並可能生成ANR。因此,爲什麼您將延遲轉換爲背景。 – matthewrdev

0

我剛剛發現了另一種解決方案。使用定時器有點奇怪,但它解決了這個問題。

protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 
     System.Timers.Timer t = new System.Timers.Timer(1); 
     t.Elapsed += (o, e) => 
     { 
      t.Stop(); 
      Thread.Sleep(10000); // Simulate a long loading process on app startup. 
      StartActivity(typeof(Activity1)); 
     }; 
     t.Start(); 
    } 
相關問題