2013-03-11 18 views
9

Ich habe eine Super-Klasse, die in einer Bibliothek ist. Diese Bibliothek kümmert sich um die Initialisierung einiger grundlegender Layoutkomponenten und anderer Dinge. Mein Problem ist, dass es 1.x Sekunden dauert, um das Layout zu laden, und zeigt das Standard-Layout für eine Weile, bevor das Kind-spezifizierte Layout gesetzt wird. Langsame Laden des Layouts

Dies ist die Methode meiner Super-Klasse:

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

Diese so genannt wird:

@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);  
} 

Die Anwendung funktioniert wie ein Zauber, aber es dauert, wie gesagt um 1. x Sekunden, um das von der Kindklasse übergebene Layout zu laden. Warum passiert das?

Auf Wunsch, dies ist meine initializeSlideMenu() Methode:

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

Ich bin ein bisschen irritiert, dass Sie 'InitializeWindow' ein _constructor_ aufrufen. Warum macht deine Superklasse nicht alles in 'onCreate()'? - Was ist los in 'initializeSlidingMenu()'? –

+0

Natürlich ist mein Bad zu früh am Morgen schlecht. In der 'initializeSlidingMenu()' initialisiere ich das gleitende Menü, bitte sehen Sie meine Bearbeitung in ein paar Sekunden. –

+0

@ user370305 Die Basisklasse hat kein Layout, das "Standard" -Android-Layout wird wie der Anwendungsname in der Aktionsleiste mit einem weißen Layout angezeigt. –

Antwort

1

Ich vermute, dass die Unruheherd für Dich ist:

v.setAdapter((ListAdapter) menuAdapter); 

Sie sollen dies ein AsyncTask als Teil tun. Es wird oft sehr langsam sein, das Laden durch den Adapter auszuführen.

Hier ist ein Ausschnitt aus einer Probe AsyncTask Implementierung:

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

Sie auch „PreExecute“ Artikel mit der Async Aufgabe sowie Updates tun.

+0

Ich versuchte dies, indem ich die Initialisierung des Adapters in ein 'Thread' setze, dachte ich, eine' asynctask' für diese einfache Operation wäre zu komplex, um dem Problem nahe zu kommen. Die Leistung hat zugenommen, aber nicht so, wie ich es erwarte. +1 für deine Antwort trotzdem. –

+0

Ich hoffe, du kannst es zum Laufen bringen. – HalR

1

Um solche Probleme zu vermeiden, gibt es im Allgemeinen drei Möglichkeiten.

  1. Lassen Sie Ihren onCreate() nach setContentView() so früh wie möglich beenden. Sie können post-delayed runnable verwenden, um einige wenige Initialisierungen zu verzögern, die in frühen Stadien nicht benötigt werden.

  2. Wenn eine Aufgabe ausgeführt wird, wenn die Ansicht bereit ist, bewirkt dies, dass Runnable zur Nachrichtenwarteschlange dieser Ansicht hinzugefügt wird.

Snippet

view.post(new Runnable() { 

     @Override 
     public void run() { 

     } 
    }); 

Wenn keine der oben genannten hilft betrachten "Optimieren mit Stubs" link: http://android-developers.blogspot.in/2009/03/android-layout-tricks-3-optimize-with.html

Hoffe, es hilft.

Verwandte Themen