开发过程中碰到的各种问题

  • studio 无法输入中文
    参考:https://www.cnblogs.com/liuwenpeng/p/12332246.html

  • 远场诊断 so 方案livedata 无法收到回调, 原因是在父类的 initData 方法中做了监听,但是子类重写 initData 的时候没有调用父类的 initData 的方法导致没有注册 Livedata,自然无法收到回调

  • 搜狗输入法在 studio 中无法输入中文
    参考:https://www.cnblogs.com/liuwenpeng/p/12332246.html
  • Installation failed due to: 'Failed to commit install session 1642747687 wit INSTALL_FAILED_VERIFICATION_FAILURE
    AS 运行无法安装,

解决办法: 1. 执行 adb shell settings put global package_verifier_enable 0
2.adb shell settings put global verifier_verify_adb_installs 0

  1. 手动用 adb install -t 安装
    4.再直接运行就可以安装成功了
  • 启动 service 报错
 java.lang.IllegalStateException: Not allowed to start service Intent { cmp=com.apache.demo/com.apache.demo/.SoundBoxMsgService (has extras) }: app is in background uid null

  • 智能音箱报 无法实例化 applicaiton

java.lang.RuntimeException: Unable to instantiate application

原因 framework.jar 是使用 implementation 而不是 compileOnly 的方式,改为 compileOnly 就可以了

  • 提示 Type androidx.lifecycle.ViewModelProvider$Factory is defined multiple times
image.png
  • Android 8.0 启动service 报错
image.png
  • complileOnly framework.jar
    采用 compileOnly 的方式依赖了 framework.jar ,但是编译的时候只能导入 系统的类,没法导入 framework.jar种的类导致无法编译,解决办法是修改编译顺序, 将 android sdk 的放到 jar 包依赖的后面
image.png
  • Android studio 无法输入中文原因:

搜狗输入法的英文输入法快捷键和 AS 的快捷键冲突了,参考: https://www.cnblogs.com/liuwenpeng/p/12332246.html

  • 运行 app 时桌面展示多个应用启动图标,原因是在manifest中有多个activity 设置了
 
  • 在 databinding中使用 livedata做数据映射时,一定要记得调用 dataBinding.lifecycle = this, 否则 livedata的数据无法在 xml中展示

  • fragment 中重写了 oncreateoptionsmenu 但是 在 toolbar 无法展示 menu菜单,原因
    1.没有执行 setSupportActionBar(Toolbar toolbar). 2.没有执行 setHasOptionsMenu(true)

  • 使用 ViewPage 承载多个Fragment, 在 Fragment的 initData方法中 调用 LiveData 的observer 方法,发现 LiveData post数据, LiveData 都能收到 多次 onChange 回调,原因是 initData 方法是定义在 onCreateView 方法中, 来回切换tab的时候会多次执行
    onCreateView 方法导致 observer执行了多次,因而会收到多次回调,解决办法是做一个标记处理

  • studio 执行 ./gradlew. 报错,提示

env: bash\r: No such file or directory

解决办法: https://blog.csdn.net/u012452490/article/details/102546481

  • 跑单元测试,提示

解决办法:https://stackoverflow.com/questions/30474767/no-tests-found-for-given-includes-error-when-running-parameterized-unit-test-in

image.png

  • 编译报错

A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptWithoutKotlincTask$KaptExecutionWorkAction > java.lang.reflect.InvocationTargetException (no error message)

解决办法: https://stackoverflow.com/questions/62131564/a-failure-occurred-while-executing-org-jetbrains-kotlin-gradle-internal-kaptexec?noredirect=1
修改gradle -> jdk 版本引用

image.png

  • Mac下查看已安装的jdk版本及其安装目录
  • NestedScrollview 内部嵌套 Recycleview, recycleview的height设置为wrap_content导致 recycleview 的item无法展示
  • RecyclerView setHasFixedSize 作用

当我们确定Item的改变不会影响RecyclerView的宽高的时候可以设置setHasFixedSize(true),并通过Adapter的增删改插方法去刷新RecyclerView,而不是通过notifyDataSetChanged()。(其实可以直接设置为true,当需要改变宽高的时候就用notifyDataSetChanged()去整体刷新一下)

  • TabLayout 是没法设置item之间的间隔的,只能自己设置background中去设置padding,参考:https://blog.csdn.net/lin_dianwei/article/details/78806816
  • 版本更新接口报错

2021-07-18 18:04:40.297 1876-2053/com.kidsedu D/OKHttp: 接收响应(247.5ms): [http://kids.test.edu.tcljd.com/api/system/getUpdateInfo?packageName=com.kidsedu] 
    Server: openresty/1.15.8.3
    Date: Wed, 21 Jul 2021 10:04:40 GMT
    Content-Type: application/json
    Transfer-Encoding: chunked
    Connection: keep-alive
    {"code":0,"msg":"Success","data":""}

报错位置

2021-07-18 18:04:40.303 1876-2053/com.kidsedu E/GsonResponseBodyConverter: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 35 path $.data
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:224)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)
        at com.kidsedu.retrofit.convertor.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:36)
        at com.kidsedu.retrofit.convertor.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:21)
        at retrofit2.ServiceMethod.toResponse(ServiceMethod.java:119)
        at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:218)
        at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:112)
        at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:519)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:919)
     Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 35 path $.data

  • Textview.setTextSize()时,传入的单位为sp,不用转为px,Paint.setTextSize();单位为:象数px,这个时候需要将 sp转为px

  • RecycleView 用gridlayout时,recycleview的高度写成matchParent。导致item只会横向显示,不会换行

  • 定义ViewModel时,定义了一个有参的构造器,但是没有定义无参构造器,导致报 "java.lang.RuntimeException: Cannot create an instance of class com.kidsedu.overseaaccount.capture.OverseaCaputreViewModel"

代码如下:

public class OverseaCaputreViewModel extends ViewModel{
  
    public OverseaCaputreViewModel(boolean notLoadData) {
        NLog.d(TAG, "cosntructor OverseaCaputreViewModel notLoadData");
    }
}

解决办法:增加无参构造器

  • 用ScrollView 包裹LinerLayout 或者 RelativeLayout时,发现包裹的布局无法撑满屏幕,
  • 使用ViewModel报错


    image.png

原因是ViewModel不是设置为public

  • 使用开源框架 banner报错
image.png

代码如下:

 @Override
    public MainHeaderViewHolder onCreateHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_main_head, parent, false);
      
        return new MainHeaderViewHolder(itemView);
    }

原因是banner中使用viewPage2,viewPage2要求设置子item的需要长或者宽度为match_paren

改为以下就可以了

 @Override
    public MainHeaderViewHolder onCreateHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_main_head, parent, false);
        //注意,必须设置为match_parent,这个是viewpager2强制要求的
        ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT);
        itemView.setLayoutParams(params);
        return new MainHeaderViewHolder(itemView);
    }


  • Android笔记之Fragment中创建ViewModel的正确方式

  • ViewPage的Fragment中创建ViewModel需要采用get(String key, Class clz)的方式来创建,否则旋转屏幕后Fragment中的ViewModel为新建的,不会保存activity销毁前的数据

  • 用 MutableLiveData 时,如果没有设置值,在判断其是否有值时

    public MutableLiveData mLoading = new MutableLiveData<>();
if (mWechatViewModel.mLoading.getValue()){
 
 }

报空指针异常
MutableLiveData Attempt to invoke virtual method 'boolean java.lang.Boolean.booleanValue()' on a null object

原因是mWechatViewModel.mLoading.getValue 获得的值为null, if中会自动把null转换为boolean值, 改为以下写法就可以了

 if (mWechatViewModel.mLoading.getValue() != null){
}
  • 内存中保存的变量变空了
自己代码中的问题:
代码中的url是通过接口返回的,存贮到了变量中,在机器内存被回收后,这部分变量值变为了“”,导致出现的这个问题;
修改后
1获取到配置信息后通过工具类的set方法将信息缓存到内存中变量一份,
2.然后再通过SP缓存到本地一份
使用时通过工具类的get方法获取
1.判断内存中变量是否未空,不为空则返回
2.为空,则通过SP从本地获取,然后赋值给内存中变量,最后返回内存中变量
  • 显示loading对话框的时候报如下错误
  • 做儿童教育时,登录成功后,需要将accoutId保存到本地SP中, 设置是否保存过密码的时候,代码如下

   public void setAccountHasPwdInfo(boolean hasPwd) {
        setBooleanValue("hasPwd_"+UserInfoManager.getInstance().getAccountId(), hasPwd);
    }
  • 在ConstraintLayout中使用include,然后给引入布局添加了底部约束,让它距离底部8dp,但是引入布局仍然出现在顶部。原因是没有给include指定宽高,不重新指定一下控件或者布局的宽高,那么给它添加的约束便会失效。
  • 继承BaseTraceAcitity, 获取父类中实例化泛型的ViewModel为null,原因是自定义的ViewModel 不是public, 没有写修饰符
  • 用RecycleView的grdiLayoutManager展示item时,这些item始终无法居中对齐,原因是item的根布局宽度不是用的match_parent,而是写死了一个dp值,导致和gridLayoutManager计算出的宽度出现冲突了,将布局宽度改为match_parent就可以居中了
  1. git自动补全命令不生效

虽然按照网上的教程在.bash_profile中做了配置,但是git自动补全命令还是无法生效,原因是通过brew按照的git-completion.bash 和本地安装的git版本不一致

  1. adb 命令提示
zsh: command not found: adb

用自己mac上的android studio 和 sdk 发送到公司新电脑的,无法识别adb命令,studio也无法识别设备. .bahs_profile 中配置了

export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/platform-tools

也没有作用,后面重新下了android studio 和 sdk,就可以了。初步怀疑是platform-tools 和 tools 跟android studio 不匹配

  • Mac 总是提醒不明身份的开发者

命令行执行 sudo spctl --master-disable

  • 用TabLayout+ ViewPage + Fragment 需要动态添加Tab,例如一开始显示2个tab,在某种情况下需要添加第3个tab来显示,发现第3个tab无法添加成功,且之前添加的两个tab对应的fragment也没有更新数据(通过日志查看adapter中已经是新new出来的Fragment了),
  • 在 Mac 上安装内存分析工具「MAT」时,报错
an error has occurred see the log file

解决办法是 右键 mat -> 显示包内容 -> content -> Eclipse -> MemoryAnalyzer.ini , 修改这个MemoryAnalyzer.ini文件 为

-startup
../Eclipse/plugins/org.eclipse.equinox.launcher_1.5.0.v20180512-1130.jar
-data
--launcher.library
../Eclipse/plugins/org.eclipse.equinox.launcher.cocoa.macosx.x86_64_1.1.700.v20180518-1200
-vm
-vmargs
-Xmx1024m
-Dorg.eclipse.swt.internal.carbon.smallFonts
-XstartOnFirstThread

  • 用 mat 打开从 android stuido中导出的hprof文件,打开失败,提示 Unknown HPROF Version (JAVA PROFILE 1.0.3) (java.io.IOException)解决办法


    image.png

解决办法: mat不能直接打开studio导出的hprof文件,需要在打开命令行窗口,SDK目录,执行以下命令:

hprof-conv  1.hprof   2.hprof

然后再次打开MAT程序,打开2.hprof文件,就可以看到正确的分析界面啦!

  • 平板横竖屏切换的时候,ViewModel中保存的数据,会在旋转屏幕后被清除掉, 代码如下
        mHomeViewModel = new ViewModelProvider(this).get("HomeFragment", HomeViewModel.class);

通过日志打印,发现旋转屏幕后生成的ViewModel和旋转屏幕前的ViewModel不是同一个。进一步发现Fragment生命周期走了两次,通过查看资料发现旋转屏幕fragment周期是会走两次的(我自己写的Demo貌似只会走一次,先不管了)。 思考为什么旋转屏幕后ViewModel会变呢? 原来是ViewModel的实例化姿势不对
改成

        mHomeViewModel = new ViewModelProvider(getActivity()).get("HomeFragment", HomeViewModel.class);

你可能感兴趣的:(开发过程中碰到的各种问题)