hitchhiker_Hitchhiker的现代Android开发指南:陷阱和隐密错误

hitchhiker

hitchhiker

没有哪个平台或语言是完美的,每个平台或语言都有其自身的问题,陷阱和隐秘的错误。 得益于Java的传统,Android通常通过庞大的博客,论坛和stackoverflow答案数据库提供顺畅,易于学习的曲线。

在运行了两个星期并指导了Study Jam系列之后,我决定编写一组开发人员遇到的常见陷阱,这些陷阱往往是晦涩的或对Google不友好的。

错误:未找到Gradle DSL方法:“ runProguard()”可能的原因:<ul> <li>项目“ XX”可能正在使用不包含该方法的Gradle版本。<a href="open.wrapper.file">打开Gradle包装器文件</a> </ li> <li>构建文件可能缺少Gradle插件。<a href="apply.gradle.plugin">应用Gradle插件</a> </ li>

这是您在Android上可能遇到的最神秘的错误之一。 如果您一直在使用Beta版的Android Studio,则在升级到gradle版本0.14.0(Android Studio 0.9)后,您可能会/会遇到此错误。 只是Android工具团队决定将runProguard重命名为minifyEnabled。 同样,已将zipAlign启用为zipAlignEnabled。 您可以在 此处找到完整的更改列表。

错误:该项目正在使用不受支持的Android Gradle插件(XXX)版本。 推荐的版本是XXX

<a href=”fixGradleElements”>修复插件版本并重新导入项目</a>

与上一问题类似,每次您更新到Android Studio和Gradle时都会发生此问题。 与前一个不同,这可以通过单击Gradle Messages窗口中提供的Fix plugin version链接轻松解决。

android.os.NetworkOnMainThreadException

如果这是您的第一个网络通话,或者您正在更新旧的应用程序以发布Honeycomb,则可能会遇到此错误。 从4.0(Ice Cream Sandwich)开始,Android OS不允许在主(UI)线程上执行网络操作,而从第0天开始就应该这样。主线程的主要职责是顺利运行UI。 联网,文件I / O或任何其他冗长的操作都将阻止UI更新,从而导致UI / UX不稳定。 联网可能是最糟糕的,因为连接速度可能取决于许多不同的因素。

解决方案很简单。 不属于UI的任何事情都不应在主线程中完成。 Android提供了一种使用线程的简便方法,称为AsyncTask。 只需使用AsyncTask执行冗长的操作。

我使用AsyncTask,但仍收到android.os.NetworkOnMainThreadException

要启动Asynctask,您需要在Asynctask对象上调用.execute方法。 调用.doInBackground方法将绕过新线程的创建,并在主线程上运行网络操作。

java.lang.SecurityException:权限拒绝:…需要Android.permission.X

Android基于linux,每个应用程序都在其自己的沙箱中运行,并且权限非常有限。 如果需要访问公用系统资源(例如相机,蓝牙,Internet或文件系统),则需要征得用户许可。 权限被添加到清单和应用程序标签之间的AndroidManifest.xml中。 您可以参考 完整的权限集,可以将其与uses-permission标签一起添加。 我添加了权限java.lang.SecurityException:权限拒绝:…需要Android.permission.X

拥有有效的AndroidManifest.xml并不一定意味着它可以正常工作。 在应用程序标记中添加uses-permission标记不会破坏xml结构,但也不会保留您询问的权限。 从应用程序标记中列出您的使用许可标记。

拒绝权限:…需要android.permission.WRITE_EXTERNAL_STORAGE

如果您确定查看了前两项,但仍收到错误,则应该是由于uses-permission标签内的android:maxSdkVersion =” 18”属性引起的。 要允许您的应用使用版本18以上的写入权限,您需要删除maxSdkProperty。

<uses-permission android:name=“android.permission.WRITE_EXTERNAL_STORAGE"/>

我的片段的溢出菜单显示不在menu.xml中的菜单项(设置)

片段可以通过重写onCreateOptionsMenu()来添加自己的菜单项。 但这并不意味着清除活动添加的菜单项。 由于片段始终由活动托管,并使用活动的上下文,因此它将从托管活动继承此类内容。 您认为不相关的项(设置作为默认菜单项给出)不属于该活动。 浏览属于该活动的menu.xml并删除不需要的项目。 FragmentTransaction类型中的方法replace或commit不适用于参数

您正在将片段对象传递给期望片段对象但仍在抱怨的方法? 好吧,并非所有片段都是相同的。 Java的设计允许名称相同的类,只要它们位于不同的程序包中即可。 Android SDK团队决定引入具有相同类名(Fragment)但使用不同包( android.support.v4.app.Fragmentandroid.app.Fragment)的fragment support软件包 导航至导入并删除错误的导入,然后添加适当的导入。

不调用onOptionsItemsSelected(),onCreateOptionMenu(),afterTextChange(Editable),onPostExecute()或应调用的任何其他方法?

@Override注释必须是有史以来最被低估的注释。 它存在的原因非常特殊。 与C ++不同,每种方法在Java中都是虚拟的。 因此,除非是最终方法,否则任何方法都可以覆盖。 @Override只是检查实现是否真的覆盖了父类中的方法。 以上所有方法都有一个错字,任何级别的开发人员都可以做。 删除覆盖注释也将删除编译器检测所谓的覆盖方法中任何拼写错误的能力。 这种错别字可能出现在方法中,甚至可能出现在参数列表中。 简单地说,如果应该调用的侦听器或方法将无提示地执行失败。 您可以通过将@Override放置到每个覆盖方法中来轻松检测到此类错误。

翻译自: https://www.javacodegeeks.com/2015/03/hitchhikers-guide-to-modern-android-development-the-pitfalls-and-cryptic-errors.html

hitchhiker

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值