這些都是實際項目 上線統(tǒng)計運營遇到的問題,還是有一定的經(jīng)驗。
第一,避免主線程操作IO 包括SP,其實這個我也沒遇到,項目上線才遇到這個問題。而且?guī)茁屎苄?。目前只發(fā)現(xiàn)在華為機器上。
第二,服務(wù)問題,8.0需要適配,因為對服務(wù)進行了限制。其實很多機器上這個沒什么關(guān)系,但是還是出現(xiàn)問題了,還是記錄一下
int sdkVersion = Build.VERSION.SDK_INT;
if (sdkVersion >= 26) {
startForegroundService(new Intent(this, SQLResourcesService.class));
} else {
startService(new Intent(this, SQLResourcesService.class));
}
//然后在服務(wù)onCreate()方法
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
//數(shù)字是隨便寫的“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問題(華為手機特別容易復現(xiàn) 榮耀系列)。
//最好在構(gòu)建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();
//還有一個,注意創(chuàng)建時候 別直接newBuilder(),要這樣去創(chuàng)建。
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,一定要記得這樣判斷一下,不然很可能會數(shù)組越界,
if (holder.getAdapterPosition() == -1) {
return;
}