10

我有一个超级类,它在图书馆里。这个库负责初始化一些基本的布局组件和其他东西。我的问题是加载布局需要 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);
}
4

2 回答 2

2

为了避免此类问题,通常有三种方法。

  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

希望能帮助到你。

于 2013-03-12T07:40:44.617 回答
1

我怀疑你的麻烦点是:

 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();

您还可以使用异步任务执行“预执行”项目,以及更新。

于 2013-03-12T00:08:32.780 回答