Android 经验分享

2023-11-19

      搞Android已经两年了,之前一直在eoe上面写文章,竟然没有写一篇CSDN的文章,真的很惭愧,从今天希望自己可以坚持下去,把每天的收获都可以保存起来,同时也分享给大家,希望大家有用!不说废话了,我先写几条我自己工作中的一些经验吧!

   

       1、  推荐一个网站---极客学院(http://www.jikexueyuan.com/),里面推出了一系列的视频教程(移动应用开发,移动游戏开发,后端开发,前端开发,智能硬件,物联网,操作系统,数据库,图像技术等的),包含了当下最新的技术,最实用的是里面讲了很多知识体系归纳和一些项目实战讲解,有些问题可以直接在极客学院里面的论坛或者社区进行讨论(eoe社区),当然里面视频并不是全部免费的。

     2.异常处理机制的使用。写一个异常处理类implement UncaughtException,可在Application中初始化这个类,这样在全局中我们便能得到应用程序抛出的任何异常,并可将这个异常以流的形式打印或者保存在本地,在适当的时候,如果我们用友盟做数据统计了,可以将我们的错误信息上传至服务器,来统计我整个应用的稳定性。

    3.BaseActivity的使用。在应用开发中,如果有多个Activity,应该写一个BaseActivity,在BaseActivity里面可封装跳转页面的方法,Toast的方法,弹出对话框的方法,标题的操作公共方法,其他Activity继承此BaseActivity即可。

 

   4.Android内存优化。Android内存泄露很容易导致内存溢出,我们称之为OOM,我有这样的一些内存优化策略,1)在循环中尽量不要使用局部变量 2)不用的对象把它置为null 3)数据库的cursor及时关闭4)构建adapter时候要使用缓存contentview 5)调用registerReceiver()注册广播时别忘记在相对应的生命周期方法里面调用unregisterReceiver() 6)及时关闭输入流和输出流7)多张图片尽量使用Lrucache或者软应用,较大的图片可以通过BitmapFactory缩放之后再使用,注意recycle.  8)尽量避免static变量引用资源耗费过多的实例。

  

      5.Android缓存机制。使用缓存机制可以为用户节省更多的数据流量,同时在用户体验上面也会很好,当第一个加载过后,第二次会相当流畅,缓存主要包含文字缓存和多媒体缓存(图片,视频),文字缓存,1)可将从服务器上得到的json数据或者xml数据先保存到sd卡中,并在数据库中添加记录,注意需要添加两个关键字段,一个是请求的url,一个是本地保存的路径,每次加载数据之前先根据url检索是否存在,若存在直接从sd卡取出。2)可先将数据解析出来,全部写入数据库,以后向服务器发请求之前先从数据库检索,然后直接返回集合等形式。图片缓存,同文字缓存第一种相似,采用当前时间+日期作为图片的名字进行缓存,并保存相应的数据库记录,从服务器取出之前先检索数据库。有一个问题,缓存了这么多图片和文字,如何删除这些缓存呢,1)在页面提供删除缓存的按钮,点击删除,可删除所有的缓存内容  2)在每一个客户端手动更新或者自动更新时候,删掉原来所有的缓存文件,重新下载新的文件进行缓存。

  

      6.ANR避免,在一些网络访问中或者很耗时的操作中都会很容易造成ANR,当一个事件的响应时间超过5秒,intentReceiver(意向接收器)超过10秒仍未执行完毕,就会引发ANR了,它有这样的几种解决方案:1)AsyncTask异步任务,在异步任务里面doInBackground()和onPostExecute(Result)两个方法非常重要,doInBackground()这个方法运行在后台线程中,主要负责执行那些很耗时的操作,如一访问网络,下载大量数据,解析xml时,这个方法必须重载。onPostExecute(Result)这个方法运行于UI线程中,在doInBackgroud(Params…)方法执行完毕之后调用,主要用于刷新UI的操作,中的参数Result即后台任务做完之后带回来的结果。2)Thread+Handler, 说到这里了,不得不提一下Handler机制,一个Handler允许你发送和处理Message和Runable对象,每个线程都有自己的Looper,每个Looper中都封装着MessageQueeue(消息队列),Looper主要是负责不断的从自己消息队列里面取出队头的任务或消息执行。每个Handler也和线程相互关联,Handler负责把Message和Runable对象传递个MessageQueeue(用post或者sendMessage等方法),而在这些对象离开MessageQueeue的时候,Handler负责执行它们(用handlerMessage方法)。其中Message就定义了一个信息,这个信息里面包含了一个描述符合任意类型的数据对象,这个信息被用来传递Hnadler.Message对象提供额外的两个int域和一个Object域。

     

      7.屏幕分辨率的自适应。现在市场上的android手机分辨率可以说是参差不齐,开发过程中,很容易遇到适配的问题,易导致效果在不同的手机上效果不一样,我们可以用两种方式进行不同手机的适配,一种是在java代码中,另外一种就是在xml文件中,第一种java代码适配,在我们适配上,虽然有着不同分辨率的手机,但他们都有固定的屏高和屏宽,可以根据宽高作为判断条件,但这种方式,要看适配的布局中,各种控件多不多,如果太多,并不适合用这种方法,因为判断太多,代码显得很长,在修改过程中,也显得很麻烦,所以我们一般的还是采用第二种方案,在xml里面适配时候,最好可以通过权重(layout_weight)的方式来分配每个组件的大小,也可以通过具体的像素(dip)来确定大小,在布局中我们通常喜欢使用线性布局(LinearLayout),而在布局中最好使用相对布局(Relativelayout),当然相对布局写起来比较麻烦一点,需要考虑到自己所有控件的布局,放置图片有drawable-hdpi,dreawable-mdpi,drawable-ldpi分别代表分辨率480*800,360*480,240*360,放置图片相差1.5倍,如果需要自适应,需要在AndroidMainfest.xml文件里面加入这一段。

<supports-screens

      android:smallScreens="true"

      android:normalScreens="true"

      android:largeScreens="true"

      android:anyDensity="true"/>

在使用图片的时候,.9.png也是可以实现自适应的。制作.9.png图片可通过ps制作,也可通过sdk下的tools工具进行制作。

  

    8.android5.0新技术。新的技术总是不断更新迭代的,5.0不仅从设计还有技术上面都有了很大的改变,它带来了一种全新的Material Design设计风格,即一种扁平化的设计,看起来更

加的时尚,用户的体验更好了(http://www.uisdc.com/comprehensive-material-design-note),

新特性地址:http://www.tuicool.com/articles/RzUJRfj;这是android5.0的一些新的特性,那么这些新的特性之后也包含了一些新的技术, 1)包含了Material主题,它主要提供了可以让你设置调色板的系统控件,为控件设计的触摸反馈动画,Activity过渡动画。2)Palatte,是一种动态色彩,可以根据图片来决定标题的颜色和标题栏的背景色,在视觉上会更有冲击力和新鲜感,而不是统一的色调,显得很呆板。3)AnimatedVectorDrawable,这个主要的作用是可以在做动画的时候使用到,它最大的特点是可以在不失清晰度的情况下进行缩放,而你仅仅只需要一个矢量图片(矢量图是根据几何特性来绘制图形,矢量可以是一个点或一条线,矢量图只能靠软件生成,文件占用内在空间较小,因为这种类型的图像文件包含独立的分离图像,可以自由无限制的重新组合。它的特点是放大后图像不会失真,和分辨率无关,适用于图形设计、文字设计和一些标志设计、版式设计等)的资源文件。4)RecyclerView,它是一个可以替代ListView的新的控件,也可以说它是listview的升级版,它比listview更先进更灵活,主要体现在:首先它给每个条目位置提供了一个布局管理器(RecyclerView.setLayoutManager),其次它为每个条目设置了操作动画(RecyclerView.setItemAnimator)5) 动画:第一中是Activity的过渡动画,包含进入,退出,共享元素,可在xml文件中配置,也可以在代码中配置。第二种就是触摸反馈,揭露效果,曲线运动,视图状态改变,触摸反馈(http://blog.csdn.net/ljx19900116/article/details/41806917)。

   

    第一次在这上面写文章,希望大家可以多多支持!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 经验分享 的相关文章

  • 找不到参数的方法 dependencyResolutionManagement()

    我正在尝试使用老师给我的一个项目 但它显示了一个错误 Settings file Users admin AndroidStudioProjects HTTPNetworking settings gradle line 1 A probl
  • React Native 从 JavaScript 代码内部访问 strings.xml

    有没有办法访问当前值android app src main res values strings xml从 JavaScript 代码内部 我想为每个构建放置不同的端点 URL 但我什至无法检测到反应本机代码内的构建类型 而不必求助于 D
  • 如何重试已消耗的 Observable?

    我正在尝试重新执行失败的已定义可观察对象 一起使用 Retrofit2 和 RxJava2 我想在单击按钮时重试特定请求及其订阅和行为 那可能吗 service excecuteLoginService url tokenModel Ret
  • 卸载后 Web 应用程序不显示“添加到主屏幕”

    这是我第一次创建网络应用程序 我设法解决了这个问题 所以我得到了实际的 chrome 提示 将其添加到主屏幕 然后我从手机上卸载了该网络应用程序 因为我想将其展示给我的同事 但是 屏幕上不再出现提示 问题 这是有意为之的行为还是我的应用程序
  • 无法获取log.d或输出Robolectrict + gradle

    有没有人能够将 System out 或 Log d 跟踪从 robolectric 测试输出到 gradle 控制台 我在用Robolectric Gradle 测试插件 https github com robolectric robo
  • Adobe 是否为其 PDF 阅读器提供 Android SDK 或 API? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我希望能够在我们的应用程序内的视图中显示本地 PDF 文件 在 Android 4 03 下的平板电脑上运行 目前 我们将 Adob eR
  • Android 模拟器插件无法初始化后端 EGL 显示

    我在 Cloudbees 上设置了 Jenkins 作业 并且可以在那里成功签出并编译我的 Android 项目 现在我想在 android 模拟器中运行一些 JUnit 测试并添加 Android 模拟器插件 我将 显示模拟器窗口 选项设
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • 是否必须删除 Intent extra?

    这可能是一个愚蠢的问题 但是是否有一条规则规定消费活动必须显式删除 Intent 额外内容 或者只有在回收 Intent 对象时才如此 换句话说 如果我总是通过执行以下操作来链接到下一个活动 Intent i new Intent MyCu
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 无法访问 com.google.android.gms.internal.zzbfm 的 zzbfm 类文件未找到

    我正在将我的 Android 应用程序项目从GCM to FCM 为此 我使用 Android Studio 中的 Firebase 助手工具 并遵循 Google 开发人员指南中的说明 一切都很顺利 并将我的应用程序代码更改为FCM根据助
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • Google 云端硬盘身份验证异常 - 需要许可吗? (v2)

    我一直在尝试将 Google Drive v2 添加到我的 Android 应用程序中 但无法获得授权 我收到 UserRecoverableAuthIOException 并显示消息 NeedPermission 我感觉 Google A
  • 错误:在根项目“projectName”中找不到项目“app”

    我有一个在 Eclipse 中开发的旧应用程序 现在尝试将其迁移到 Android Studio 我更新了库并遵循了基本步骤 现在 我收到此错误 Error Project app not found in root project pro
  • Android Studio - Windows 7 上的 Android SDK 问题

    我对 Google i o 2013 上发布的最新开发工具 Android Studio 有疑问 我已经成功安装了该程序并且能够正常启动 我可以导入现有项目并对其进行编辑 但是 当我尝试单击 SDK 管理器图标或 AVD 管理器图标时 或者
  • Android 套接字和 asynctask

    我即将开始制作一个应该充当 tcp 聊天客户端的应用程序 我一直在阅读和阅读 我得出的结论是最好 如果不需要 将我的套接字和异步任务中的阅读器 问题是我不确定从哪里开始 因为我是 Android 新手 这至少对我来说是一项艰巨的任务 但据我
  • Android:膨胀布局时出现 StackOverFlowError 和 InvokingTargetException

    首先 对不起我的英语 我在膨胀布局时有一个问题 我有一个自定义视图 从 LinearLayout 扩展而来 称为按钮帮助 我在名为的布局上使用该视图加载活动 我的以下代码在所有设备和模拟器上都能完美运行 但具有 QVGA 屏幕 例如 Sam
  • android sdk 的位置尚未在 Windows 操作系统的首选项中设置

    在 Eclipse 上 我转到 windows gt Android SDK 和 AVD Manager 然后弹出此消息 Android sdk 的位置尚未在首选项中设置 进入首选项 在侧边栏找到 Android 然后会出现一个 SDK 位
  • Crashlytics 出现 Android Studio 构建错误

    我正在尝试将 CrashLytics 与 Android Studio 和 gradle 一起使用 但出现一个令人困惑的错误 java lang NoSuchMethodError 我的 build gradle 是 buildscript

随机推荐