实习杂记(32):getApplicationInfo或者getPackageManger出错

本文分析了Android系统中Binder通信导致的RuntimeException问题,探讨了其背后的原因,并提出了有效的解决方案,包括代码结构调整和异常处理策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


发生这种错误原因第一个是:binder通信


getPackageManger  是通过binder通信的,最大通信是1M,而且这个binder通信是系统整个的,

也就是当前整个手机APP所有应用同一个时刻,或者同一个时间内 进行通信   超过了IM,


就会报:RuntimeException  和  RomatoException      这里大家想的办法是同步,不能一定保证的,


第二个原因是:是我们写代码的习惯连着写,如下面这样的:


getPackageManger.getApplicationInfo(),这个时候编辑器智能提示的  只有getApplicationInfo()可能发生的异常,NameNotFoundException 


从而让我们忽略了  运行时异常,导致程序崩溃。这里大家想的办法是分开,我推荐这种


<span style="font-size:18px;"><strong>    public static ApplicationInfo getApplicationInfo(Context context) {
        PackageManager pm;
        String packageName;
        try {
            pm = context.getPackageManager();
            packageName = context.getPackageName();
        } catch (RuntimeException e) {
            return null;
        }
        if (pm == null || packageName == null) {
            return null;
        }
        ApplicationInfo applicationInfo;
        try {
            applicationInfo = pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA);
        } catch (PackageManager.NameNotFoundException e) {
            return null;
        }
        return applicationInfo;
    }</strong></span>


当然还有一种是如果习惯连着写,那就把两种异常   选择他们的父类即可,

<span style="font-size:18px;"><strong>		try {
			PackageManager pm = mContext.getPackageManager();
			ApplicationInfo ai = pm.getApplicationInfo(mContext.getPackageName(), PackageManager.GET_ACTIVITIES);
			return ai.uid;
		} catch (Exception e) {
			e.printStackTrace();
		}</strong></span>

这里为什么不采用同步,因为那个还是无法避免超过1M的,所以只要无法获取就直接返回NULL比较好。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值