缓慢加载布局

我有一个在图书馆的超级class。 这个库负责初始化一些基本的布局组件和其他东西。 我的问题是需要1.x秒来加载布局,并显示一段时间的默认布局,然后设置子指定的布局。

这是我的超类的方法:

public void InitializeWindow(Activity act, int layoutResourceId, String windowTitle, Object menuAdapter, int slideMenuMode) { super.setContentView(layoutResourceId); super.setBehindContentView(R.layout.menu_frame); this.menuAdapter = menuAdapter; this.slideMenuMode = slideMenuMode; setWindowTitle(windowTitle); initializeSlidingMenu(); } 

这就是这样调用的:

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.InitializeWindow(this, R.layout.activity_home, "\t\tHome", new MenuAdapter(this, R.menu.slide_menu), SlidingMenu.TOUCHMODE_FULLSCREEN); } 

应用程序就像一个魅力,但它需要,正如我所说的1.x秒加载从子级传递的布局。 为什么会这样呢?

通过请求,这是我的initializeSlideMenu()方法:

 public void initializeSlidingMenu() { this.setSlidingActionBarEnabled(true); getSlidingMenu().setBehindOffsetRes(R.dimen.actionbar_home_width); getSlidingMenu().setShadowWidthRes(R.dimen.shadow_width); getSlidingMenu().setShadowDrawable(R.drawable.shadow); getSlidingMenu().setTouchModeAbove(slideMenuMode); getSlidingMenu().setBehindScrollScale(0.25f); ListView v = new ListView(this); v.setBackgroundColor(Color.parseColor("#000000")); v.setAdapter((ListAdapter) menuAdapter); getSlidingMenu().setMenu(v); } 

Solutions Collecting From Web of "缓慢加载布局"

我怀疑你的麻烦点是:

  v.setAdapter((ListAdapter) menuAdapter); 

你应该做一个AsyncTask一部分。 通过适配器执行加载通常会非常缓慢。

以下是AsyncTask示例实现的一个片段:

 //before starting the load, I pop up some indicators that I'm doing some loading progressBar.setVisibility(View.VISIBLE); loadingText.setVisibility(View.INVISIBLE); AsyncTask<Void, Void, Void> loadingTask = new AsyncTask<Void, Void, Void>() { private ArrayList<Thing> thingArray; @Override protected Void doInBackground(Void... params) { //this is a slow sql fetch and calculate for me thingArray = MyUtility.fetchThings(inputValue); return null; } @Override public void onPostExecute(Void arg0) { EfficientAdapter myAdapter = new EfficientAdapter(MyActivity.this, thingArray); listView.setAdapter(myAdapter); //after setting up my adapter, I turn off my loading indicators progressBar.setVisibility(View.INVISIBLE); loadingText.setVisibility(View.INVISIBLE); RelativeLayout layout = (RelativeLayout)MyActivity.this.findViewById(R.id.spacey); if (layout != null) { LayoutInflater inflater = LayoutInflater.from(MyActivity.this); View view = inflater.inflate(R.layout.name_tabled_sub, layout); NamedTableView tableView = new NamedTableView(MyActivity.this, view); } progressBar.setVisibility(View.INVISIBLE); loadingText.setVisibility(View.INVISIBLE); } }; loadingTask.execute(); 

您也可以使用Async任务执行“PreExecute”项目以及更新。

为了避免这样的问题,一般有三种方法。

  1. 让你的onCreate()在setContentView()之后尽快完成。 你可以使用postDelayed runnable来延迟在初始阶段可能不需要的初始化。

  2. 当视图准备就绪时,执行一些任务,导致Runnable被添加到该视图的消息队列中。

片段

 view.post(new Runnable() { @Override public void run() { } }); 

如果以上都没有帮助,请考虑“使用存根优化”链接: http : //android-developers.blogspot.in/2009/03/android-layout-tricks-3-optimize-with.html

希望能帮助到你。