23、Glide 加载七牛视频缩略图问题
1.直接使用Glide 加载的效果,图片按照视频原来大小显示
image.png2.在原来视频 Url 拼接 ?vframe/jpg/offset/1 获取缩略图
clipboard.png22、Activity SingleTask启动模式
MainActivity 设置为启动页,并且启动launchModel=“singleTask”, 跳转到其他页面后按 HOME 键回到桌面,再点击 app 图标进入,显示的不是最后一次打开的页面,而是 MainActivity 页面。
原因:SingleTask 表示 activity 栈中只有一个实例,而且 MainActivity 又是启动页,所以点击 app 图标进入 app, 相当于重新打开 MainActivity,这时在 MainActivity 上的 activity 会被弹出销毁。
解决:使用一个专门的启动页(StartActivity)作为 app 启动页,app 启动通过 StartActivity 跳转到 MainActivity, 并把 StartActivity 销毁
<activity android:name=".features.system.StartActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name=".features.common.MainActivity"
android:configChanges="orientation|screenSize"
android:launchMode="singleTask">
<!--<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>-->
</activity>
21、Kotlin 获取 String 字节数
fun String.bytesLength(): Int {
return byteInputStream().available()
}
20、EditText#setFilters() 限制输入字节数
edittext.addTextChangedListener(new TextWatcherWrapper() {
@Override
public void afterTextChanged(Editable s) {
String string = s.toString().trim();
//限定输入框最多输入32个字节
int inputLength = string.length();
int byteLength = string.getBytes().length;
if (byteLength >= 32) {
edittext.setFilters(new InputFilter[]{new InputFilter.LengthFilter(inputLength)});
} else {
edittext.setFilters(new InputFilter[]{new InputFilter.LengthFilter(32)});
}
edittext.setSelection(edittext.getText().toString().length());
}
});
19、Glide加载原图OOM
直接使用into(imageView) 加载图片模糊改为
GlideApp.with(mContext)
.load(item)
.into(new SimpleTarget<Drawable>() {
@Override
public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
binding.iv.setImageDrawable(resource);
}
});
加载原图
4.4手机(1280x720)警告OOM:
image.png优化前:
image.png优化:
GlideApp.with(mContext)
.load(item)
.override(IMAGE_WIDTH)//设置最大宽度为屏幕宽度
.skipMemoryCache(true)//跳过内存缓存
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
.into(new SimpleTarget<Drawable>() {
@Override
public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
binding.iv.setImageDrawable(resource);
}
});
优化后:
image.png18、DataBinding 自定义View的属性
@BindingAdapter({"app:nestedScrollingEnabled"})
public static void setNestedScrollingEnabled(RecyclerView recyclerView, boolean enabled) {
recyclerView.setNestedScrollingEnabled(enabled);
}
在xml中要加 @{} 配合使用,否则提示没有 app:nestedScrollingEnabled
这个属性
app:nestedScrollingEnabled="@{false}"
17、静态变量
场景:CartUtil中有个isNeedChange静态变量,根据这个变量判断是否需要刷新购物车。在第一次打开app时可以正常执行,在直接按返回键退出在进来就不能正常刷新购物车了,原因是CartUtil没有随着app退出而销毁(类没有被卸载,app退出了,进程还在内存中,没有被系统杀死),isNeedChange在内存中的状态还是false。解决:1)不用静态变量 2)退出app是手动航设置isNeedChange=true
注意:退出Activity不等共同于退出程序(进程)
16、Kotlin: java.util.NoSuchElementException: Collection contains no element matching the predicate.
list.first({})改list.firstOrNull({})
15、Android8.0 报错 java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation
只有全屏不透明的activity才能设置方向
解决:<item name="android:windowIsTranslucent">false</item>
<item name="android:windowDisablePreview">true</item>
14、横竖屏切换导致activity重走生命周期解决办法:在清单文件的Activity里配置android:configChanges="orientation|screenSize"
13、华为荣耀6X:下载的视频本地无法播放(手机播放器闪退)。文件名:wx_2018-05-29 16:59:13_0.mp4。原因是手机不支持一些特殊符合:"/:*?<>|" 文件名包存在“:”所以不支持
12、序列化:把对象转换为字节序列的过程称为对象的序列化。
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。
11、java kotlin 浮点计算进度丢失问题(101*29.8)。使用BigDecimal解决
10、1) 第一次请求权限时,用户拒绝了,下一次:shouldShowRequestPermissionRationale() 返回 true,应该显示一些为什么需要这个权限的说明
2)第二次请求权限时,用户拒绝了,并选择了“不在提醒”的选项时:shouldShowRequestPermissionRationale() 返回 false
9、kotlin recycleview adapter 多布局
item 要是可空类型。
否则会报错java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter item
8、kotlin基础泛型类,子类不需要泛型的情况
7、new ArrayList<>(list)
6、kotlin泛型
out:小的可以赋给大的
class TypedClass<out T>()
val t1 = TypedClass<String>()
val t2: TypedClass<Any> = t1
网友评论