2013-03-11 29 views
9

私はライブラリにあるスーパークラスを持っています。このライブラリは、いくつかの基本的なレイアウトコンポーネントやその他の要素を初期化します。私の問題は、レイアウトをロードするのに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); 
} 
+0

私はあなたに 'InitializeWindow'を_constructor_と呼ぶことに少し心配しています。あなたのスーパークラスが 'onCreate()'のすべてのものをしないのはなぜですか? - 'initializeSlidingMenu()'では何が起こっていますか? –

+0

もちろん、私の朝は早すぎます。 'initializeSlidingMenu()'では、スライディングメニューを初期化します。数秒で私の編集を見てください。 –

+0

@ user370305ベースクラスにはレイアウトがありません。デフォルトのアンドロイドレイアウトが、アクションバーのアプリケーション名のように白いレイアウトで表示されます。 –

答えて

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

あなたはまた、非同期タスクだけでなく、アップデートで「PreExecute」の項目を行うことができます。

+0

私はこれを試しました。アダプタの初期化を 'Thread'の中に入れることで、この単純な操作のための' asynctask'は問題を解決する複雑な方法でした。パフォーマンスは向上しましたが、私が期待する方法ではありませんでした。とにかくあなたの答え+1。 –

+0

私はあなたがそれをうまく動かすことができることを願っています。 – HalR

1

このような問題を回避するには、一般的に3つの方法があります。

  1. 可能な限り早くsetContentView()をコールしてからonCreate()を終了させて​​ください。 postDelayed実行可能ファイルを使用すると、初期段階で必要とされない初期化を遅延させることができます。

  2. ビューの準備ができたら、そのビューのメッセージキューにRunnableを追加します。

スニペット

view.post(new Runnable() { 

     @Override 
     public void run() { 

     } 
    }); 

上記のいずれもがリンク "スタブと最適化" を検討助けていない場合:http://android-developers.blogspot.in/2009/03/android-layout-tricks-3-optimize-with.html

はそれがお役に立てば幸いです。

関連する問題