这些都是实际项目 上线统计运营遇到的问题,还是有一定的经验。
第一,避免主线程操作IO 包括SP,其实这个我也没遇到,项目上线才遇到这个问题。而且几率很小。目前只发现在华为机器上。
第二,服务问题,8.0需要适配,因为对服务进行了限制。其实很多机器上这个没什么关系,但是还是出现问题了,还是记录一下
int sdkVersion = Build.VERSION.SDK_INT;
if (sdkVersion >= 26) {
startForegroundService(new Intent(this, SQLResourcesService.class));
} else {
startService(new Intent(this, SQLResourcesService.class));
}
//然后在服务onCreate()方法
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
//数字是随便写的“40”,
nm.createNotificationChannel(new NotificationChannel("40", "App Service", NotificationManager.IMPORTANCE_DEFAULT));
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "40");
//其中的2,是也随便写的,正式项目也是随便写
startForeground(2 ,builder.build());
}
第三,okhttp复用连接池OOM问题(华为手机特别容易复现 荣耀系列)。
//最好在构建okhttp的时候自定义一个连接池,因为有可能不会复用的情况 然后没有回收,造成资源浪费。
//从而 用户很频繁操作 就会造成OOM,ps:okhttp默认是5分钟空闲 不用才会回收。
.connectTimeout(TimeOut, TimeUnit.SECONDS)
.readTimeout(TimeOut, TimeUnit.SECONDS)
.writeTimeout(TimeOut, TimeUnit.SECONDS)
.connectionPool(new ConnectionPool(5, 5, TimeUnit.SECONDS))
.build();
//还有一个,注意创建时候 别直接newBuilder(),要这样去创建。
private static final int TimeOut = 60;
private static OkHttpClient.Builder builder = null;
private static final OkHttpClient.Builder holderOkHttp() {
if (builder == null) {
builder = new OkHttpClient.Builder();
builder.connectTimeout(TimeOut, TimeUnit.SECONDS);//链接超时时间
builder.writeTimeout(TimeOut, TimeUnit.SECONDS);//写操作 超时时间
builder.readTimeout(TimeOut, TimeUnit.SECONDS);//读操作超时时间
builder.addInterceptor(chain -> {
Request originalRequest = chain.request();
Request.Builder requestBuilder = originalRequest.newBuilder()
.addHeader("token", AppConfig.getToken())
.addHeader("User-Agent", "android-"
+ DeviceUtils.getUniqueDeviceId()
+ "-v2." + AppUtils.getAppVersionName()
+ "-rom " + RomUtils.getRomInfo());
Request request = requestBuilder.build();
return chain.proceed(request);
});
builder.connectionPool(new ConnectionPool(5, 60, TimeUnit.SECONDS));
}
return builder;
}
第四,recyclerView adapter 的问题
//如果你使用到这个api,一定要记得这样判断一下,不然很可能会数组越界,
if (holder.getAdapterPosition() == -1) {
return;
}
网友评论