6.Android Studio引用Module时报错:Unable to resolve dependency for ':app@debug/…
造成上图错误的可能原因有:
- Module模块的SdkVersion高于主项目的SdkVersion;
- Module模块被定义为application,而不是library。
解决办法:
- 对于第一种情况造成的错误,我们需要统一主模块和Module模块的SdkVersion,保持SdkVersion一致。
- 对于第二种情况造成的错误,我们需要把Module模块定义为library:
(1)打开引用的模块的build.gradle文件:
(2)修改application为library,同时删除applicationId:
7.Execution failed for task ‘:app:processDebugManifest’. Manifest merger failed with multiple errors, see logs
在完成一个Project运行时,出现build failed的报错,就很迷茫,到底是哪里出问题了,错误提示一大堆:
这时可点击左侧,用以显示具体运行情况和出错位置,
出现如下所示界面
此时,我们找到Android Studio菜单下的Build, 选择Clean Project,等Clean Project好了之后,我们再点击ReBuild Project。
并且在项目build.gradle(app)中添加
allprojects { gradle.projectsEvaluated { tasks.withType(JavaCompile) { options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" } }}
显示出详细错误位置,此时再运行即可查看错误出在什么地方,
大意是说,在app里的Manifast配置文件和ocr_ui中的Manifast配置文件的参数出现冲突,改成一致即可(这里的ocr_ui是和app同级的文件夹,用来实现特定UI效果)
修改之后再运行,成功build,
8.Attempt to invoke virtual method ‘void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)’ on a null object reference
是在点击Button组件时出现的,详细错误如下,
java.lang.RuntimeException: Unable to start activity ComponentInfo{xxx.OCRActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference ... Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference ...
意思大概是说调用了一个空对象的不存在的方法,但是我的Button明明是存在的啊,为什么会这样呢?
原来是因为在Project中有多个活动,一个MainActivity和其他活动,我这个Button是在其他活动,这里是在OCRActivity中调用的,每个活动都有一个对应的.xml文件,来对里面的组建进行布局,所以每个活动都必须用setContentView()方法设置自己对应的布局,但是由于疏忽,把OCRActivity活动的对应布局文件也设成了activity_main,所以导致在生成OCRActivity的时候在activity_main.xml中找不到Button对应的布局,才会报错,在setContentView()方法中的参数改为activity_ocr即可正常运行。
如图,出现这样的提示信息即表明在活动间正常切换了,对APP的操作也可正常进行,如此便可以在不同活动中随意切换了。
这个小异常也告诉我们在Android开发的时候要兼顾各方面,从活动到布局,再到配置,包括外部包的引入都要统一、匹配,各个活动、组件、之间的调用,以及与系统的交互等等,都要格外细心,甚至代码有时错一个字母、大小写不服,都会导致很大的问题,所以一定要谨慎、谨慎、再谨慎,细心、细心、再细心!!!
9.解决android.os.NetworkOnMainThreadException
在Android开发时,因为代码没有问题但总是报错。最后查阅资料了解到,在Android 4.0以上,网络连接不能放在主线程上,不然就会报错android.os.NetworkOnMainThreadException。但是4.0下版本不会报错。
官方解释为
在Android4.0以后,会发现,只要是写在主线程(就是Activity)中的HTTP请求,运行时都会报错,这是因为Android在4.0以后为了防止应用的ANR(Aplication Not Response)异常,Android这个设计是为了防止网络请求时间过长而导致界面假死的情况发生。
解决此问题有两种方法:
(1)可以在Activity的onCreate()方法中加入一段代码,适用于网络请求数据量很小的情况,如下
if (android.os.Build.VERSION.SDK_INT > 9) { StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); }
(2)启动一条子线程进行你的网络请求(推荐使用)
// Android 4.0 之后不能在主线程中请求HTTP请求 new Thread(new Runnable(){ @Override public void run() { cachedImage = asyncImageLoader.loadDrawable(imageUrl, position); imageView.setImageDrawable(cachedImage); } }).start();
10.Android stdio 引用so错误问题:Could not get unknown property ‘jniLibs’ for source set ‘main’ of type
在Android studio 中为了让目录结构中显示出libs对应的目录结构如下:
需要在模块对应的build.gradle 文件中添加如下配置:
sourceSets{ main{ jniLibs.srcDirs = ['libs'] } }
但是,添加完成后依然报错:
Could not get unknown property 'jniLibs' for source set 'main' of type org.gradle.api.internal.tasks.DefaultSourceSet.
原因可能是这个配置放的位置不对,正确的方法如下图所示:











