9

Mam super klasę, która znajduje się w bibliotece. Ta biblioteka zajmuje się inicjowaniem podstawowych elementów układu i innych rzeczy. Mój problem polega na tym, że wczytanie układu zajmuje 1.x sekund i pokazuje domyślny układ przez pewien czas przed ustawieniem układu podanego przez dziecko.Powolne ładowanie układu

Jest to metoda mojego super klasy:

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

Nazywa się to w ten sposób:

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

Aplikacja działa jak czar, ale to trwa, jak powiedziałem około 1. x sekundy, aby załadować układ przekazany z klasy potomnej. Dlaczego to się dzieje?

Na życzenie, to mój initializeSlideMenu() metoda:

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

Jestem trochę zirytowany, że nazywacie 'InitializeWindow' a _constructor_. Dlaczego twoja superklasa nie robi wszystkich rzeczy w 'onCreate()'? - Co się dzieje w 'initializeSlidingMenu()'? –

+0

Oczywiście, moje złe zbyt wcześnie rano. W 'initializeSlidingMenu()' ja inicjalizuję przesuwne menu, zobacz moją edycję za kilka sekund. –

+0

@ user370305 baseclass nie ma żadnego układu, "domyślny" układ androida jest wyświetlany, podobnie jak nazwa aplikacji na pasku akcji, z białym układem. –

Odpowiedz

1

Podejrzewam, że problem jest miejscem dla Ciebie z:

v.setAdapter((ListAdapter) menuAdapter); 

Należy to zrobić w ramach AsyncTask. Ładowanie adaptera będzie bardzo powolne.

Oto urywek z realizacji próbka 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(); 

Można również zrobić „PreExecute” rzeczy z zadania Async, jak również aktualizację.

+0

Próbowałem tego, umieszczając initalization adaptera wewnątrz 'Thread', myślałem, że' asynktask' dla tej prostej operacji był złożony sposób zbliżenia się do rozwiązania problemu. Wydajność wzrosła, ale nie tak, jak się spodziewam. +1 za twoją odpowiedź. –

+0

Mam nadzieję, że uda ci się to wymyślić. – HalR

1

Aby uniknąć takich problemów, na ogół istnieją trzy sposoby.

  1. Pozwól swojemuCreate() zakończyć po wywołaniu metody setContentView() jak najwcześniej. Możesz użyć funkcji postDelayed, aby opóźnić kilka inicjalizacji, które mogą nie być potrzebne na wczesnych etapach.

  2. Wykonaj pewne zadanie, gdy widok jest gotowy, powoduje dodanie Runnable do kolejki komunikatów tego widoku.

Snippet

view.post(new Runnable() { 

     @Override 
     public void run() { 

     } 
    }); 

Jeśli żadna z powyższych pomaga rozważyć "Optymalizacja w króćce" link: http://android-developers.blogspot.in/2009/03/android-layout-tricks-3-optimize-with.html

Nadzieję, że to pomaga.