5

Để cung cấp kiểu chữ tùy chỉnh trong ListActivity, tôi đã viết một lớp CustomAdapter mở rộng BaseAdapter theo ví dụ này here.Chuyển tiếp chậm hoạt động: nhiều "khởi tạo trạng thái thổi phồng" trong LogCat

Tuy nhiên, như mô tả ở đó, tôi đã viết các phương pháp getView() như sau:

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

này hoạt động như dự kiến. Điều đáng lo ngại nhất là phải mất khoảng ba hoặc bốn giây cho đến khi danh sách xuất hiện (và đây là một thời gian rất dài trong ngữ cảnh này). Tuy nhiên, trong ListActivity tôi đặt onItemClickListener s như thế này:

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

Bây giờ khi nhấp vào một ListItem, phải mất thời gian nhiều hơn cho đến khi GameActivity mở ra. Điều này Activity chỉ là một vài TextView s đầy thông tin lấy từ một cơ sở dữ liệu SQLite. Ngoài ra ở đây, tôi đặt một kiểu chữ tùy chỉnh cho mỗi TextView. Nó xảy ra ngay cả khi màn hình bị đen trong 2-3 giây (xuất hiện các ứng dụng bị rơi), sau đó mới Activity xuất hiện. Điều này không xảy ra khi truy cập vào số Activity từ những nơi khác trong ứng dụng.

Trong cả hai trường hợp - truy cập vào ListActivity và truy cập vào GameActivity từ ListActivity - một vài

"szipinf - Khởi thổi phồng tình trạng"

thông điệp xuất hiện trong LogCat. Chúng có ý nghĩa gì trong bối cảnh này? Nó có phải là cách sử dụng tốt hơn để đặt onItemClickListener s vào phương thức getView() của CustomAdapter của tôi không? Một cái gì đó dường như thực sự ức chế chuyển tiếp, nhưng tôi không thể hiểu được điều gì, vì không có gì lớn để được tính toán hoặc xử lý (trên thực tế, trong cơ sở dữ liệu SQLite chính xác là hai mục với mỗi 5 trường)?

EDIT Nếu được yêu cầu hoặc mong muốn, tất nhiên tôi có thể cung cấp thêm mã.

Trả lời

3

Tôi đã có chính xác cùng một vấn đề và câu hỏi của bạn đã cho tôi câu trả lời!

Tôi vẫn không biết chính xác nguyên nhân gốc rễ nhưng điều này isuue là vì đọc font chữ tùy chỉnh từ tài sản nhiều lần trong trường hợp của tôi. Nếu tôi có 10 tiện ích trong màn hình của mình và mỗi tiện ích con đang sử dụng phông chữ tùy chỉnh, Android sẽ tải nó xuống từ mọi tài sản. không chỉ khiến cho hoạt động chuyển đổi của tôi trở nên chậm mà còn gây ra sự cố sau khi chơi với nó nhiều tmes.

Vì vậy, tôi đã tạo bộ nhớ cache cho kiểu chữ của mình để tránh tìm nạp phông chữ mọi lúc từ nội dung.

tôi đã thêm mã này bên trong lớp tiện ích của tôi:

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

Tôi tạo ra lớp tùy chỉnh của tôi để thu 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)); 
} 

} 

biến assetPath có thể được sử dụng để cung cấp các phông chữ khác nhau trong thời gian chạy

EDIT: Here là typefaceManager tùy chỉnh mà tôi đã tạo làm thư viện để làm cho nó thêm chung.

Các vấn đề liên quan