2011-03-07 39 views
2

我有一个MainActivity。有时当它加载时,我观察到黑屏一秒钟。 我测量了onCreate方法的运行时间,发现花费了一秒多的时间setContentView(R.layout.main_screen); 在执行setContentView期间,我更喜欢显示前一个屏幕(在我的情况下是启动屏幕)而不是此黑屏。 我怎样才能摆脱这个黑屏?setContentView执行期间的黑色屏幕

似乎android会以某种方式预加载布局,并且有时会出现此类问题。但是如果我杀了我的程序并启动应用程序,我总会看到这个黑屏。

回答

2
  1. 使用静态变量来处理View缓存。
  2. 使用AsyncTask以不冻结你的出身Activity
  3. 使用LayoutInflater膨胀的View布局,并将它缓存
  4. 在目标活动的onCreate()设置缓存

事情是这样的:

原产活动

... 
       //noinspection unchecked 
       new AsyncTask<Void, Void, Void>() { 
        @Override 
        protected Void doInBackground(Void... params) { 
         LayoutInflater inflater = (LayoutInflater) 
           MainParentActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

         // VERY VERY SLOW action if your Activity is heavy 
         DialerActivity.cachedView = inflater.inflate(R.layout.dialer_portrait, null, false); 
         return null; 
        } 

        @Override 
        protected void onPostExecute(Void aVoid) { 
         Intent intent = new Intent(MainParentActivity.this, DialerActivity.class); 
         intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
         startActivity(intent); 
        } 
       }.execute(); 

... 

目标活动

public class DialerActivity extends MainParentActivity { 
    static View cachedView = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     if (cachedView != null) { 
      setContentView(cachedView); 
     } else { 
      setContentView(R.layout.dialer_portrait); 
     } 
    } 
. . . 

你也可以使用一个ProgressDialog而膨胀,以避免在过渡冻结的感觉。