Android ANR文件分析

1、ANR文件第一个“main”线程是否有提示具体问题,如果有的话根据对应提示找到代码;
2、锁问题:ANR文件第一个”main”中如果有保护“mutator lock” shared held,这个可能是主线程中加了锁,而且与其他线程锁产生死锁等问题造成,然后根据下面文件找到项目中出问题的代码文件。这种大概率是Handler处理主线程与其他线程时造成了死锁。

Notification Service

public class KeepAppAliveService extends Service {
private NotificationManager mNotificationManager;
private String mNotificationId = “keepAppAliveId”;
private String mNotificationName = “Keep app alive”;

@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}

@Override
public void onCreate() {
super.onCreate();
mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(mNotificationId, mNotificationName, NotificationManager.IMPORTANCE_HIGH);
mNotificationManager.createNotificationChannel(channel);
}
startForeground(1, getNotification());
}

private Notification getNotification() {
Notification.Builder builder = new Notification.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(“七牛推流”)
.setContentText(“后台运行中”);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
builder.setChannelId(mNotificationId);
}
return builder.build();
}
}

Android webview高度过高问题

现象:recycleview中item项包含webview,当webview中内容高度过高(图片过大)导致recycleview一直刷新;
原因:图片过高,导致加载之后item自动计算高度出现问题,从而重复刷新列表;
解决办法:限制图片高度
if (!TextUtils.isEmpty(formula_text)) {
Matcher matcher = Pattern.compile(“]*>([\\s\\S]*)<\\/body>“).matcher(formula_text);
if (matcher.find()) {//通过正则表达式找出body的内容,包括body标签。下面是head内容,适配手机宽度、图片大小、文字换行
String head = “” +

+


+
““;
formula_text = “” + head + matcher.group() + ““;
}else{
String head = “” +

+


+
““;
formula_text = “” + head + ““+formula_text+”” + ““;
}
}
// webview.loadData(content, “text/html; charset=utf-8”, “utf-8”);
this.loadDataWithBaseURL(“null”,formula_text+””,”text/html”,”UTF-8″,”about:blank”);

Android AutoSize适配问题

部分设备上适配有问题(整体缩小或者放大)。
原因:autosize读取到的宽高反了;
解决办法:
只需在Application中手动设置宽高
AutoSizeConfig.getInstance()

//是否让框架支持自定义 Fragment 的适配参数, 由于这个需求是比较少见的, 所以须要使用者手动开启
//如果没有这个需求建议不开启
.setCustomFragment(true)

//是否屏蔽系统字体大小对 AndroidAutoSize 的影响, 如果为 true, App 内的字体的大小将不会跟随系统设置中字体大小的改变
//如果为 false, 则会跟随系统设置中字体大小的改变, 默认为 false
// .setExcludeFontScale(true)

//区别于系统字体大小的放大比例, AndroidAutoSize 允许 APP 内部可以独立于系统字体大小之外,独自拥有全局调节 APP 字体大小的能力
//当然, 在 APP 内您必须使用 sp 来作为字体的单位, 否则此功能无效, 不设置或将此值设为 0 则取消此功能
// .setPrivateFontScale(0.8f)

//屏幕适配监听器
.setOnAdaptListener(new onAdaptListener() {
@Override
public void onAdaptBefore(Object target, Activity activity) {
//使用以下代码, 可以解决横竖屏切换时的屏幕适配问题
//使用以下代码, 可支持 Android 的分屏或缩放模式, 但前提是在分屏或缩放模式下当用户改变您 App 的窗口大小时
//系统会重绘当前的页面, 经测试在某些机型, 某些情况下系统不会主动重绘当前页面, 所以这时您需要自行重绘当前页面
//ScreenUtils.getScreenSize(activity) 的参数一定要不要传 Application!!!
AutoSizeConfig.getInstance().setScreenWidth(ScreenUtils.getScreenSize(activity)[0]);
AutoSizeConfig.getInstance().setScreenHeight(ScreenUtils.getScreenSize(activity)[1]);
// MLog.d(“Application”,”orientation:”+ScreenUtils.getScreenSize(activity)[0]+”,”+ScreenUtils.getScreenSize(activity)[1]);

AutoSizeLog.d(String.format(Locale.ENGLISH, “%s onAdaptBefore!”, target.getClass().getName()));
}

@Override
public void onAdaptAfter(Object target, Activity activity) {
AutoSizeLog.d(String.format(Locale.ENGLISH, “%s onAdaptAfter!”, target.getClass().getName()));
}
});

界面自定义尺寸:
1、实现CustomAdapt
@Override
public boolean isBaseOnWidth() {
return AutoSizeConfig.getInstance().getInitScreenWidthDp()>AutoSizeConfig.getInstance().getInitScreenHeightDp();//这边页面是横屏所以宽大于高,如果是竖屏使用高大于宽
}

@Override
public float getSizeInDp() {
return 960;//实际适配宽
}