2011-03-09 83 views
1

我就在構建應用程序的開始(這甚至不執行任何操作,但會顯示一些按鈕),當我運行它,我得到了logcat中的錯誤信息: 「從字體緩存[23條目]」一遍又一遍地提供193K,直到大約一分鐘後,由於內存不足導致應用程序崩潰。我的3個按鈕是自定義按鈕,使用自定義字體。字體也許有問題?應用不斷「清洗從字體緩存」,並最終崩潰由於內存不足,Android的

+0

沒錯。我想我們需要更多關於你的字體的細節以及你如何使用它。 – 2011-03-09 20:22:15

+0

我想我可能已經到底了。我在自定義按鈕的onDraw方法中設置了字體。它移動到構造函數和我沒有得到任何的問題更:) – 2011-03-09 20:40:06

+0

我用Typeface.createFromAsset()內廣泛的onCreate()進行了一堆的TextView的(從XML膨脹),而我看到這個消息Skia的每一個活動。 this.finish() – 2011-06-27 18:30:13

回答

0

我已經能夠通過聲明字樣的活動課中的靜態大幅度減少這種Skia的消息(和最終的內存不足情況)。

public class myActivity extends Activity 
{ 
    //font 
    private static Typeface mFontHelvet; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.mylayout); 

     if (mFontHelvet == null) 
     { 
      mFontHelvet = Typeface.createFromAsset(this.getAssets(), "Helvetica.TTF"); 
     } 

     myTextView = (TextView) findViewById(R.id.mytextview); 
     myTextView.setTypeface(mFontHelvet); 
     myTextView.setText("blah blah"); 
    } 
} 

這似乎風險很大,但至少用戶可以來回走我的兩個活動之間沒有進入低內存狀態!

+1

你可以移動到這個擴展應用程序的類,有一個'getHelvet();這樣它永遠只能加載每個應用程序運行一次,而不是在創建活動每次'方法。 – Blundell 2012-03-18 22:32:12

+0

@Blundell能否請你提供你正在推薦的樣品。我有我在我的應用程序中使用自定義字體的相同情況。但是我把它放在我的代碼中的每一個活動中。所以這些活動緩慢加載。 – 2012-08-15 11:15:20

+1

jeraldov - 請參閱本教程以「擴展應用程序」:http://www.devahead.com/blog/2011/06/extending-the-android-application-class-and-dealing-with-singleton/ – 2012-08-17 06:17:55

6

問題是調用Typeface.createFromAsset()。

我已經減少了創建字體出廠,所以它調用Typeface.createFromAsset()每個字體類型一次。

字體工廠擁有一個HashMap中的字體,並且做的伎倆。

我發現這個鏈接上的解決方案,並調整了一點點:

http://www.levinotik.com/2011/09/22/custom-fonts-in-android-can-cause-issues-heres-how-to-fix-it/

這是怎麼了,我實現它。

public class FontFactory { 
    private static FontFactory instance = new FontFactory(); 
    private HashMap<String, Typeface> fontMap = new HashMap<String, Typeface>(); 

    private FontFactory() { 
    } 

    public static FontFactory getInstance() { 
     return instance; 
    } 

    public Typeface getFont(String font) { 
     Typeface typeface = fontMap.get(font); 
     if (typeface == null) { 
      typeface = Typeface.createFromAsset(MyApplication.getApplicationContext().getResources().getAssets(), "fonts/" + font); 
      fontMap.put(font, typeface); 
     } 
     return typeface; 
    } 
}