RuntimeException:无法制作本机字体或自定义 TextView 加载字体的内存泄漏

     2023-04-15     175

关键词:

【中文标题】RuntimeException:无法制作本机字体或自定义 TextView 加载字体的内存泄漏【英文标题】:RuntimeException: native typeface cannot be made or memory leak for custom TextView loading font 【发布时间】:2014-01-23 10:13:50 【问题描述】:

我的代码中存在一个巨大的问题,其中我从自定义 TextView 类加载我的 assets\fonts\ 文件夹中的字体。第一个问题是它在 4.0 设备上崩溃,但 Caused by: java.lang.RuntimeException: native typeface cannot be made 除外。我正在使用相同的过程here 方法:

public class MyTextView extends TextView 

      public MyTextView(Context context, AttributeSet attrs, int defStyle) 
          super(context, attrs, defStyle);
      

     public MyTextView(Context context, AttributeSet attrs) 
          super(context, attrs);
      

     public MyTextView(Context context) 
          super(context);
     


    public void setTypeface(Typeface tf, int style) 
        if (style == Typeface.BOLD) 
            super.setTypeface(Typeface.createFromAsset(
                    getContext().getAssets(), "fonts/hirakakupronbold.ttf"));
         else if (style == Typeface.ITALIC) 
            super.setTypeface(Typeface.createFromAsset(
                    getContext().getAssets(), "fonts/hirakakupronitalic.ttf"));
         else 
            super.setTypeface(Typeface.createFromAsset(
                    getContext().getAssets(), "fonts/hirakakupron.ttf"));
        
    

请注意,我正在使用扩展名.ttf,我发现这是导致RunTimeException 的原因。所以我用.otf 扩展名转换了各自的字体,现在它已经在4.0 设备中运行,但基于here 存在内存泄漏。有解决方法here,但我不知道如何使用/调用它。任何帮助都可以,谢谢。

【问题讨论】:

【参考方案1】:

好的,所以我终于想到,在 TextView 类中实例化 TypeFace 对象会在每次实例化相同的 TextView 时导致如此多的负载。这导致我的应用程序滞后并最终导致OutOfMemoryException。所以我所做的是创建一个不同的自定义 TypeFace 类,该类将从资产中调用我的字体,以便它从 TypeFace 类而不是 TextView 类实例化。

这是我的 TypeFaces 类:

public class TypeFaces 

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

    public static Typeface getTypeFace(Context context, String assetPath) 
        synchronized (cache) 
            if (!cache.containsKey(assetPath)) 
                try 
                    Typeface typeFace = Typeface.createFromAsset(
                            context.getAssets(), assetPath);
                    cache.put(assetPath, typeFace);
                 catch (Exception e) 
                    Log.e("TypeFaces", "Typeface not loaded.");
                    return null;
                
            
            return cache.get(assetPath);
        
    

还有自定义的 TextView 类:

public class TextViewHirakaku extends TextView 

    public TextViewHirakaku(Context context, AttributeSet attrs, int defStyle) 
        super(context, attrs, defStyle);
    

    public TextViewHirakaku(Context context, AttributeSet attrs) 
        super(context, attrs);
    

    public TextViewHirakaku(Context context) 
        super(context);
    

    public void setTypeface(Typeface tf, int style) 
        if (style == Typeface.BOLD) 
            super.setTypeface(TypeFaces.getTypeFace(getContext(),
                    "fonts/hirakakupronbold.ttf"));
         else if (style == Typeface.ITALIC) 
            super.setTypeface(TypeFaces.getTypeFace(getContext(),
                    "fonts/hirakakupronitalic.ttf"));
         else 
            super.setTypeface(TypeFaces.getTypeFace(getContext(),
                    "fonts/hirakakupron.ttf"));
        
    

请注意,我现在在这里从 TypeFaces 类调用 getTypeFace 方法。

【讨论】:

【参考方案2】:

如果您在 Android Studio 上遇到此问题,请将您的资产放在主目录下,而不是放在 res 目录下。

在字体命名中也只能使用小写字母和下划线,例如我的字体.ttf

这对我来说很有魅力

【讨论】:

【参考方案3】:

如果您是从 xml 扩展此视图,请尝试以这种方式使用它::

public class MyTextView extends TextView 

  public MyTextView(Context context, AttributeSet attrs, int defStyle) 
      super(context, attrs, defStyle);
      init();
  

 public MyTextView(Context context, AttributeSet attrs) 
      super(context, attrs);
      init();
  

 public MyTextView(Context context) 
      super(context);
      init();
 


public void init() 
    Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "fonts/hirakakupronbold.ttf");
    setTypeface(tf);


它对我来说工作正常。为每种字体样式创建单独的类扩展 TextView。要应用它,请将“TextView”替换为“com.yourpackage.MyTextView”

问候,

【讨论】:

【参考方案4】:

就我而言,我用于自定义视图 (costum) 的 XML 命名空间前缀设置不正确:

xmlns:costum="http://schemas.android.com/apk/tools"

我要做的就是把它改成

xmlns:costum="http://schemas.android.com/apk/res-auto"

& 成功了。

【讨论】:

java.lang.RuntimeException:无法连接到相机服务

】java.lang.RuntimeException:无法连接到相机服务【英文标题】:java.lang.RuntimeException:FailtoConnecttocameraservice【发布时间】:2011-10-1617:42:45【问题描述】:我尝试制作一个可以打开和关闭相机闪光灯的应用。我的atm代码如下所示:Camera... 查看详情

Android Java.Lang.RuntimeException:无法启动活动组件信息

】AndroidJava.Lang.RuntimeException:无法启动活动组件信息【英文标题】:AndroidJava.Lang.RuntimeException:UnabletostartactivityComponentInfo【发布时间】:2014-04-2917:38:23【问题描述】:我是安卓程序员的新手。最近,我尝试在android应用程序中制作... 查看详情

React 本机 iOS 字体无法以任何方式工作

】React本机iOS字体无法以任何方式工作【英文标题】:ReactnativeiOSfontsdoesnotworkinanyway【发布时间】:2018-07-0214:29:03【问题描述】:警告:这不是重复的!我搜索并完成了那里的所有方法。我使用最新版本的react&react-native(0.55)。... 查看详情

java.lang.RuntimeException:无法在尚未调用 Looper.prepare() 的线程上敬酒 [重复]

】java.lang.RuntimeException:无法在尚未调用Looper.prepare()的线程上敬酒[重复]【英文标题】:java.lang.RuntimeException:Can\'ttoastonathreadthathasnotcalledLooper.prepare()[duplicate]【发布时间】:2020-01-1316:28:36【问题描述】:我正在按照Udemy的教程制... 查看详情

java.lang.illegalargumentexception:无法加载本机库

...它显示以下异常:03-2716:42:09.982:E/AndroidRuntime(1275):java.lang.RuntimeException:UnabletostartactivityComponentInfo{com.ir 查看详情

使用自定义字体时出现问题 - “无法制作原生字体”

】使用自定义字体时出现问题-“无法制作原生字体”【英文标题】:Issuewhenusingacustomfont-"nativetypefacecannotbemade"【发布时间】:2011-11-2319:34:33【问题描述】:我正在尝试使用在互联网上找到的字体,但问题是我得到了一个... 查看详情

Worklight 本机应用程序 C2DM_ERROR RuntimeException

】Worklight本机应用程序C2DM_ERRORRuntimeException【英文标题】:WorklightNativeApplicationC2DM_ERRORRuntimeException【发布时间】:2014-05-0913:54:47【问题描述】:我有一个在prod环境中运行的应用程序,最近我看到很多RuntimExceptionsforC2DM_REGISTERED和C... 查看详情

RuntimeException:无法调度事件@otto

】RuntimeException:无法调度事件@otto【英文标题】:RuntimeException:Couldnotdispatchevent@otto【发布时间】:2014-08-0321:45:34【问题描述】:我们当前的应用程序版本中存在来自otto的EventHandler的问题。我们在崩溃日志中得到一个RuntimeException... 查看详情

RuntimeException:无法猜测内核目录

】RuntimeException:无法猜测内核目录【英文标题】:RuntimeException:UnabletoguesstheKerneldirectory【发布时间】:2018-08-2414:25:19【问题描述】:我正在使用Symfony3.4。突然,每当我尝试在/tests中运行我的测试(phpunit)时,我都会收到以下错... 查看详情

RuntimeException:无法膨胀行为子类

】RuntimeException:无法膨胀行为子类【英文标题】:RuntimeException:CouldnotinflateBehaviorsubclass【发布时间】:2017-12-1910:28:39【问题描述】:我是android新手,我遇到了FloatingActionButton行为问题我的自定义行为类:publicclassScrollingFABBehaviore... 查看详情

Symfony - RuntimeException:无法写入缓存文件

】Symfony-RuntimeException:无法写入缓存文件【英文标题】:Symfony-RuntimeException:Failedtowritecachefile【发布时间】:2012-08-2419:40:43【问题描述】:我无法正确获取权限。我正在尝试通过XAMPP在我的Mac上的本地环境中运行它。我尝试了以... 查看详情

RuntimeException:无法实例化应用程序

】RuntimeException:无法实例化应用程序【英文标题】:RuntimeException:Unabletoinstantiateapplication【发布时间】:2012-04-2609:53:13【问题描述】:当我运行我的应用程序时,每次我的logcat中都会出现以下异常:04-1409:29:53.965:W/dalvikvm(1020):thre... 查看详情

制作第一个ui字体

...要制作独特的字体。  1.系统字体的风格和美观程度等无法满足需求。    一般来说,系统字体都比较死板、生硬,风格单一,经常无法满足项目需求。当需要在某些地方显示一些造型独特的字体,更需要制作自己独特的... 查看详情

无法启动活动 ComponentInfo java.lang.RuntimeException:无法创建 webview

】无法启动活动ComponentInfojava.lang.RuntimeException:无法创建webview【英文标题】:UnabletostartactivityComponentInfojava.lang.RuntimeException:Failedtocreatewebview【发布时间】:2020-01-0804:44:02【问题描述】:我正在开发ionicv1项目。我的问题是-将andro... 查看详情

Android 6.0 RuntimeException:无法连接到相机服务

】Android6.0RuntimeException:无法连接到相机服务【英文标题】:Android6.0RuntimeException:Failtoconnecttocameraservice【发布时间】:2016-01-2111:10:45【问题描述】:我在Nexus5(Android6.0)中运行的应用出现错误。错误是java.lang.RuntimeException:连接相机... 查看详情

RuntimeException:无法启动接收器“包名”:NullPointerException

】RuntimeException:无法启动接收器“包名”:NullPointerException【英文标题】:RuntimeException:Unabletostartreceiver"packagename":NullPointerException【发布时间】:2014-07-1307:32:14【问题描述】:我知道这个问题是重复的。但是我在这里找... 查看详情

未捕获的异常“RuntimeException”,消息“无法写入缓存目录”

】未捕获的异常“RuntimeException”,消息“无法写入缓存目录”【英文标题】:Uncaughtexception\'RuntimeException\'withmessage\'Unabletowriteinthecachedirectory【发布时间】:2018-01-2706:32:22【问题描述】:当我尝试在服务器上部署我的网站时出现... 查看详情

java.lang.RuntimeException:无法解析 Oracle 数据库版本

】java.lang.RuntimeException:无法解析Oracle数据库版本【英文标题】:java.lang.RuntimeException:FailedtoresolveOracledatabaseversion【发布时间】:2021-11-0408:36:38【问题描述】:我在kafka连接中使用debeziumoracle连接器。启动连接器时出现以下错误,... 查看详情