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

2019-07-08 18:24:42 浏览数 (1)

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

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

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

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

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

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

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

代码语言:javascript复制
<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>

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

代码语言:javascript复制
<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比较好。

0 人点赞