记录开发当中遇到的问题及小知识点(持续更新...)
来源:互联网 发布:电商运营 知乎 编辑:程序博客网 时间:2024/06/06 01:22
Glide图片加载
一、You cannot start a load for a destroyed activity
这应该是基本上每一个人最开始都会遇到的错误了!原因是当你的acitivity已经销毁了但是异步任务还在进行,若此时你在异步任务当中用到了Glide那么就会直接闪退
解决方法网上也有非常多,感觉都挺不错的但是不建议使用getApplicationContext传给with(),虽然很方便但是分分钟内存泄漏!目前是这样解决(具体哪种好以后再做深入的研究)
private boolean isAttached; @Override public void onAttachedToWindow() { super.onAttachedToWindow(); isAttached = true; } @Override public void onDetachedFromWindow() { super.onDetachedFromWindow(); isAttached = false; } public void glideImage(String url, int errorResId, ImageView imageView) { if (isAttached) { Glide.with(this) .load(url) .dontAnimate() .placeholder(errorResId) .error(errorResId) .into(imageView); } }
二、You must not call setTag() on a view Glide is targeting
手动给Glide into的ImageView设置tag或者在复用contentview时item的根部局就是ImageView时就会报这个错!查看源码就能知道原因是与其内部维护的tag冲突了我是直接setTag( key,Object)解决
@Overridepublic Request getRequest() { Object tag = getTag(); Request request = null; if (tag != null) { if (tag instanceof Request) { request = (Request) tag; } else { throw new IllegalArgumentException("You must not call setTag() on a view Glide is targeting"); } } return request;}
三、Glide暂停加载,启动加载
列表滚动的时候暂停加载
Glide.with(mContext).pauseRequests();
列表未滚动时开始加载
Glide.with(mContext).resumeRequests();
四、 Glide加载高度wrap_content时保证图片不变形
- 在网上查了许多解决办法但是都不太适合自己,使用override会导致加载速度变慢,很蛋疼
- 我的解决方案是自定义ImageView重写onMeasure方法并在xml设置这两个属性
android:adjustViewBounds=”true”//保持原图长宽比
android:scaleType=”fitXY”//充满宽高
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { Drawable d = getDrawable(); if (d != null) { int width = MeasureSpec.getSize(widthMeasureSpec); //高度根据使得图片的宽度充满屏幕计算而得 int height = (int) Math.ceil((float) width * (float) d.getIntrinsicHeight() / (float) d.getIntrinsicWidth()); setMeasuredDimension(width, height); } else { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } }
安卓各版本适配
一、Android6.0动态权限
- 引入RxPermission
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'compile 'io.reactivex.rxjava2:rxjava:2.0.5'compile 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.3@aar'
- 单权限
RxPermissions rxPermission = new RxPermissions(MeetingDetailActivity.this); rxPermission.request(Manifest.permission.CAMERA) .subscribe(new Consumer<Boolean>() { @Override public void accept(Boolean aBoolean) throws Exception { if (aBoolean) {//同意权限 } } });
- 多权限(不理会用户拒绝、不再询问的方式,接受的是一个可变参数)
private void requestRxPermissions(String... permissions) { RxPermissions rxPermissions = new RxPermissions(this); rxPermissions.request(Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE) .subscribe(new Consumer<Boolean>() { @Override public void accept(@NonNull Boolean granted) throws Exception { if (granted){//已获取权限 }else {//拒绝了任意一个权限 } } }); }
- 多权限(需要处理用户拒绝、不再询问的方式,permission.name可以拿到权限名)
RxPermissions rxPermissions = new RxPermissions(this); rxPermissions.requestEach(permissions) .subscribe(new Consumer<Permission>() { @Override public void accept(@NonNull Permission permission) throws Exception { if (permission.granted) { } else if (permission.shouldShowRequestPermissionRationale){//拒绝权限请求 } else { // 拒绝权限请求,并不再询问 // 可以提醒用户进入设置界面去设置权限 } } });
二、Android7.0共享文件(无法对外暴露file类型的URI)
1.在清单文件中声明一个Provider
<provider android:name="android.support.v4.content.FileProvider" android:authorities="任意命名,之后获取URI要用到" android:exported="是否需要对外开放(true/false)" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/filepaths" /> </provider>
2.在res目录下新建xml文件夹,创建一个filepaths.xml(与Provider的resource对应)
该xml文件可以指定各种路径,具体就不细说了,直接百度安卓7.0共享文件一堆堆
<?xml version="1.0" encoding="utf-8"?><resource> <paths> <external-path name="external" path="" /> </paths></resource>
3.打开系统相机拍照(记住要申请CAMERA以及WRITE_EXTERNAL_STORAGE权限)
当初刚遇到这个问题的时候耽误了很长时间,provider、xml换了一个又一个但死活拿不到照片,后来才猛然想起没有申请WRITE_EXTERNAL_STORAGE
private Uri imageUri;private void openCamera() { takePicFile = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis() + ".jpg"); Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//设置Action为拍照 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//分版本获取URI //通过FileProvider创建一个content类型的Uri imageUri = FileProvider.getUriForFile(BuyProjectActivity.this, "这里对应清单文件Provider的authorities", takePicFile); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //表示临时授权该Uri所代表的文件 } else { imageUri = Uri.fromFile(takePicFile); } intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//将拍取的照片保存到指定URI startActivityForResult(intent, Constant.RequestCode.TAKEPHOTO_REQUESTCODE);}
二维码扫描
关于二维码扫描这块可是花了够多心思,在github上选定了一个扫描速度非常满意的开源项目,样式改好,扫描后的操作都满足需求之后,测试却说压根无法使用,360度各种角度都无法扫描,我当然很震惊并大喊这不可能!!!然后自己拿着测试机扫确实一点反应没有,当时就觉得很奇怪,明明自己用网页上的二维码扫描速度是相当快的!后来发现是因为二维码处于一个黑色背景且四周都是发亮的荷花,只要把手机亮度调到最亮,我手上的十七八个开源二维码扫描全部无法使用,脑子一闪我就打开微信的扫一扫,看面对这种情况马化腾又能怎样,于是惊讶的发现微信一旦感应到这种反射光很强的场景就会让整个surfaceview变暗然后很快的就扫描出了结果!!!就这样机缘巧合之下找到了解决问题的关键,将Camera曝光度调低(一个小白的二维码扫描历程……)if里面的判断googlde挺久的,因为部分手机单单setExposureCompensation不起作用,要将自动锁定曝光设置为false
Parameters parameters = camera.getParameters(); parameters.setExposureCompensation(parameters.getMinExposureCompensation()); if(parameters.isAutoExposureLockSupported()) parameters.setAutoExposureLock(false);
Selector
一、点击一个item,里面所有的子item响应该点击事件(item设置点击事件并给子item加入这2行代码)
android:duplicateParentState="true" android:clickable="false"
二、通过代码设置Selector(网络获取图片动态设置点击效果时)(-代表xml文件下的false)
StateListDrawable drawable = new StateListDrawable();drawable.addState(new int[]{-android.R.attr.state_pressed}, normalDrawable);drawable.addState(new int[]{android.R.attr.state_pressed}, clickDrawable);iv_label.setBackground(drawable);
其他
一、 导入第三方库导致资源重复命名的问题 :app:transformResourcesWithMergeJavaResForDebug
- xml引用的attrs结构:
<resources> <declare-styleable name=""> <attr name="" format="" /> </declare-styleable></resources>
- 找到报错的attrname,将该name抽出来,每一个declare-styleable去引用即可!如下所示
<resources> <attr name="test" format="" /> <declare-styleable name=""> <attr name="test"/> </declare-styleable></resources>
二、第三方库的minSdkVersion高于主项目minSdkVersion所导致的问题app:processDebugManifest
AndroidManifest清单文件的root标签中加入
xmlns:tools=”http://schemas.android.com/tools”uses-sdk标签中加入(合并时忽略版本,多个库用逗号隔开)
tools:overrideLibrary=”第三方库1,第三方库2”
三、android.widget.ZoomButtonsControllerandroid.app.LoadedApk.forgetReceiverDispatcher
- 出现该错误是由于webview的 ZoomButton,也就是那两个放大和缩小的按钮导致的。刚进去会出现该按钮,一段时间后自动隐藏,如果在他隐藏期间用户手动返回销毁了该webview就会闪退!
- 解决方法有很多,如果项目当中不需要这个功能,那么直接setBuiltInZoomControls(false)即可!
@Override protected void onDestroy() { super.onDestroy(); /** * 方法一:直接移除所有view */ ViewGroup view = (ViewGroup) getWindow().getDecorView(); view.removeAllViews(); /** * 方法二:延时销毁WebView */ if (web_content != null) { web_content.getSettings().setBuiltInZoomControls(true); web_content.setVisibility(View.GONE); long timeout = ViewConfiguration.getZoomControlsTimeout();//timeout ==3000 new Timer().schedule(new TimerTask() { @Override public void run() { // TODO Auto-generated method stub web_content.destroy(); } }, timeout); } }
- 记录开发当中遇到的问题及小知识点(持续更新...)
- android 开发中遇到的一些小的知识点在此做一个记录(持续更新)
- Android Stock Browser Web App开发当中遇到的问题(持续更新)
- android开发中总会遇到的小问题【持续更新...】
- 安卓知识点及问题处理方案记录,持续更新~
- S5P4418开发遇到的问题(持续更新)
- Android小知识点记录【持续更新】
- 记录开发中遇到的坑或者Bug<持续更新...>
- 一些开发中遇到的小问题小记(持续更新中)
- (持续更新)日积月累——iOS开发过程中遇到的一些小问题
- 【开发问题记录,持续更新..】
- web开发小知识点(持续更新)
- Ubuntu下出现的小问题及解决方案记录(持续更新)
- OC 开发当中的一些小技巧(持续更新ing)
- java web开发中遇到的问题及解决方案(个人学习日志,持续更新)
- 数据库开发遇到的问题及解决方案(个人日志、持续更新)
- java开发中遇到的问题及解决方法(持续更新)
- 使用Android Studio开发时遇到的问题及解答(持续更新中~~)
- JDBC中为什么推荐使用PreparedStatement
- Instant Run
- 命中注定
- LinearLayout的两个关键属性(layout_gravity&weight)
- MySql从一窍不通到入门(五)Sharding:分表、分库、分片和分区
- 记录开发当中遇到的问题及小知识点(持续更新...)
- STM32 MPU6050姿态融合(转)
- springboot配置国际化
- DUBBO学习:启动检查
- 设计模式学习之路
- DES加解密
- 分布式文件系统MFS的基本用法以及高可用实现
- window对象
- 文章标题