2013-03-11 14 views
9

Ho una super classe che si trova in una libreria. Questa libreria si occupa di inizializzare alcuni componenti di base del layout e altre cose. Il mio problema è che ci vogliono 1.x secondi per caricare il layout e mostra il layout predefinito per un po ', prima di impostare il layout specificato per il bambino.Caricamento lento del layout

questo è il metodo della mia classe super:

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

questo è chiamato in questo modo:

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

L'applicazione funziona come un fascino, ma ci vuole, come ho detto in giro 1. x secondi per caricare il layout passato dalla classe figlio. Perché succede?

A richiesta, questo è il mio metodo 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

Sono un po 'irritato che si chiami 'InitializeWindow' a _constructor_. Perché la tua superclasse non fa tutto in 'onCreate()'? - Cosa succede in 'initializeSlidingMenu()'? –

+0

Certo, il mio male troppo presto la mattina. In 'initializeSlidingMenu()' Initalizzo il menu di scorrimento, per favore vedi la mia modifica in pochi secondi. –

+0

@ user370305 la baseclass non ha alcun layout, viene mostrato il layout "predefinito" di Android, come il nome dell'applicazione nella barra di azione, con un layout bianco. –

risposta

1

Ho il sospetto che il punto guai per te è con:

v.setAdapter((ListAdapter) menuAdapter); 

Si dovrebbe fare questo come parte di un AsyncTask. Sarà spesso molto lento eseguire il caricamento dall'adattatore.

Ecco un frammento da un esempio di implementazione 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(); 

Si può anche fare articoli "preExecute" con il compito asincrono, così come aggiornamento.

+0

Ho provato questo, inserendo l'initalization dell'adattatore all'interno di un 'Thread', ho pensato che un' asynctask' per questa semplice operazione fosse un modo complesso per avvicinarsi alla soluzione del problema. Le prestazioni sono aumentate, ma non come mi aspetto. +1 per la tua risposta comunque. –

+0

Spero che tu possa farlo funzionare. – HalR

1

Per evitare tali problemi ci sono tre modi in generale.

  1. Si compia la tua onCreate() Fine dopo setContentView() chiamare il più presto possibile. Puoi usare postDelayed eseguibile per ritardare poche inizializzazioni che potrebbero non essere necessarie nelle prime fasi.

  2. Esegui qualche compito quando la vista è pronta, fa sì che il Runnable venga aggiunto alla coda messaggi di quella vista.

Snippet

view.post(new Runnable() { 

     @Override 
     public void run() { 

     } 
    }); 

Se nessuno dei precedenti aiuta considerano "Ottimizza con stub" link: http://android-developers.blogspot.in/2009/03/android-layout-tricks-3-optimize-with.html

Speranza che aiuta.

Problemi correlati