5

Al fine di fornire un carattere personalizzato nel mio ListActivity, ho scritto una classe CustomAdapter estende BaseAdapter secondo questo esempio here.lenta transizione di Attività: multipla "inizializzazione gonfiare stato" in LogCat

Tuttavia, come descritto qui, ho scritto il metodo getView() come segue:

public View getView(int position, View convertView, ViewGroup parent){ 
    String gameName = gameNames[position]; // gameName ist the String[] of the Custom Adapter 

    TextView tv = new TextView(context); 
    tv.setText(gameName); 
    tv.setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/gulim.ttf")); 

    return tv; 
} 

Questo funziona come previsto. L'unica cosa che disturba è che ci vogliono circa tre o quattro secondi fino a quando la lista si presenta (e questo è un tempo molto lungo in questo contesto). Tuttavia, nel ListActivity ho impostato le onItemClickListener s in questo modo:

private void setOnItemClickListener(){ 
    getListView().setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View view, int pos, long id){ 
      onClickEntryButton(((TextView) view).getText().toString()); 
     } 
    }); 
} 

private void onClickEntryButton(String gameName){ 
    Intent intent = new Intent(this, GameActivity.class); 
    intent.putExtra("gameName", gameName); 
    startActivity(intent); 
    finish(); 
} 

Ora quando si fa clic su un ListItem, ci vuole ancora più tempo fino a quando il GameActivity apre. Questo Activity è solo un paio di TextView pieno di informazioni tratte da un database SQLite. Anche qui, ho impostato un carattere personalizzato su ogni TextView. Succede anche che lo schermo diventi nero per 2-3 secondi (apparendo l'app si è schiantato), quindi appare il nuovo Activity. Ciò non accederà a quello Activity da altri punti nell'applicazione.

In entrambi i casi - l'accesso alla ListActivity e l'accesso alla GameActivity dal ListActivity - un paio di

"szipinf - Inizializzazione gonfiare Stato"

messaggi appaiono nella LogCat. Cosa significano in questo contesto? Sarebbe un uso migliore impostare i onItemClickListener nel metodo getView() del mio CustomAdapter? Qualcosa sembra davvero inibire le transizioni, ma non riesco a capire cosa, dato che non c'è nulla di grande da calcolare o elaborare (infatti, nel database SQLite ci sono esattamente due voci con ogni 5 campi)?

EDIT Se richiesto o desiderato, ovviamente posso fornire più codice.

risposta

3

Ho avuto esattamente lo stesso problema e la tua domanda mi ha dato risposta!

Ancora non conosco la causa principale esatta ma questo è dovuto alla lettura di font personalizzati da risorse più volte nel mio caso. Se sul mio schermo sono presenti 10 widget e ognuno di essi utilizza il carattere personalizzato, Android lo carica sempre dalle risorse. il che non solo causava il rallentamento dei miei movimenti di attività, ma provocava anche un crash dopo aver giocato con più tmes.

Così ho creato una cache per il mio carattere tipografico per evitare di recuperare il carattere tipografico ogni volta dalle risorse.

ho aggiunto questo codice dentro la mia classe di utilità:

private static final Hashtable<String, Typeface> cache = new Hashtable<String, Typeface>(); 

public static final String ASSET_PATH="assetPath"; 

public static Typeface getFont(Context c, String assetPath) { 
    synchronized (cache) { 
     if (!cache.containsKey(assetPath)) { 
      try { 
       Typeface t =(Typeface.createFromAsset(c.getAssets(), 
         "fonts/arial.ttf")); 
       cache.put(assetPath, t); 
      } catch (Exception e) { 
       return null; 
      } 
     } 
     return cache.get(assetPath); 
    } 
} 

ho creato la mia classe personalizzata per a setTypeface

public class MyButton extends Button { 

public MyButton(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

public MyButton(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public MyButton(Context context) { 
    super(context); 
} 

@Override 
public void setTypeface(Typeface tf) { 

    super.setTypeface(Util.getFont(getContext(), Util.ASSET_PATH)); 
} 

} 

assetPath variabile può essere utilizzata per fornire i font diffrent in fase di esecuzione

EDIT: Here è il tipo di carattere personalizzato Gestore che ho creato come libreria per renderlo più generico.

Problemi correlati