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 经验分享 的相关文章

  • Android 通知进度条冻结

    这是我正在使用的代码 http pastebin com 3bMCKURu http pastebin com 3bMCKURu 问题是 一段时间后 文件变得更重 通知栏下拉速度变慢 最后它就冻结了 你的通知太频繁了 这就是它冻结的原因 让
  • getItem 与 getItemAtPosition

    有两种方法可以获取列表视图中的选定项目 list getAdapter getItem position list getItemAtPosition position 我的问题是 哪一种是首选的做法 我见过人们同时使用这两种方法 您可以使
  • Delphi XE7 Android 全屏(隐藏软键)

    如何在XE7中全屏显示 隐藏顶部 标题 和底部 软键 工具栏 在 XE6 中 我可以通过在应用程序部分写入来调整 AndroidManifest 以使我的应用程序全屏显示并且没有操作栏 android theme android style
  • KitKat(及更低版本)设备上的 Android Material Design

    我将在我们学校开发一个 Android 应用程序作为一个项目 我想使用 Google 的新 Material Design 但我知道它仅适用于 Android L 设备 Jack Underwood 最近发布了名为 Today Calend
  • 无法在自定义 AOSP 上安装 Google Play 中的某些应用程序:项目不可用。理由:9

    我在尝试从 Google Play 安装某些应用程序时收到以下错误 LibraryUtils isAvailable not available restriction 9 DocUtils getAvailabilityRestricti
  • 在意图过滤器中使用多个操作时的默认值

    尝试理解 Android 中的意图和操作并查看文档 http developer android com guide topics intents intents filters html 但我一直看到的一件事是定义了多个操作的意图过滤器
  • 已经使用 AsyncTask doInBackground 但新数据未显示

    我使用 AsyncTask 创建一个聊天室来接收消息 因此它总是检查即将到来的消息并将其显示给客户端 但代码似乎无法按我希望的方式工作 在客户端只显示所有旧数据 新数据不显示 因为当我尝试从服务器发送消息时 新数据没有显示在客户端中 我对这
  • TextView 之间有分隔线

    我正在尝试在 android studio 中创建以下布局 因为我对 android 东西还很陌生 所以我第一次尝试使用 LinearLayout 并认为这可能无法实现 现在我正在尝试使用RelativeLayout 我已经用颜色创建了这个
  • 如何在 sqlite 中将 2 列合并为新列

    我有一个包含 3 列的表 我必须将 2 列中的值按降序排列到一列中 A B C z 1 2 f 5 7 s 9 5 使用此示例 输出会将 B 列和 C 列中的值放入其中 如下所示 A B s 9 f 7 f 5 s 5 z 2 z 1 我当
  • 请求位置更新参数

    这就是 requestLocationUpdates 的样子 我使用它的方式 requestLocationUpdates String provider long minTime float minDistance LocationLis
  • 应用程序未安装在 Android 模拟器上

    我正在 android Geocoder 中开发一个应用程序 当我运行该应用程序时 它会显示 2011 01 11 11 08 13 GeoTourProject 自动目标模式 使用现有模拟器 emulator 5554 运行兼容的 AVD
  • Android 版 Robotium - solo.searchText () 不起作用

    我在使用 Robotium 时遇到 searchText 函数问题 我正在寻找这个字符串
  • MediaCodec 创建输入表面

    我想使用 MediaCodec 将 Surface 编码为 H 264 使用 API 18 有一种方法可以通过调用 createInputSurface 然后在该表面上绘图来对表面中的内容进行编码 我在 createInputSurface
  • 检查 Android 手机上的方向

    如何查看Android手机是横屏还是竖屏 当前配置用于确定要检索的资源 可从资源中获取Configuration object getResources getConfiguration orientation 您可以通过查看其值来检查方向
  • 使用 Matrix.setPolyToPoly 选择位图上具有 4 个点的区域

    我正在 Android 上使用位图 在使用 4 个点选择位图上的区域时遇到问题 并非所有 4 点组都适合我 在某些情况下 结果只是一个空白位图 而不是裁剪后的位图 如图所示 并且 logcat 中没有任何错误 甚至是内存错误 这是我用来进行
  • Android Webview 图像未加载

    我制作了一个简单的应用程序WebView 但有些图片无法加载 正确 在我的电脑上 错误 在模拟器中 Correct 错误 没有横幅 于是我用Chrome debug进行调试 发现我的代码被改变了 我不添加像noscript or style
  • 调节麦克风录音音量

    我们正在尝试调整录音时的音量级别 麦克风似乎非常敏感 会接收到很多静电 我们查看了 setVolumeControlStream 但找不到传入其中来控制麦克风的流 将您的音频源设置为 MIC using MediaRecorder Audi
  • 使用 Espresso 检查 EditText 的字体大小、高度和宽度

    如何使用 Espresso 检查 EditText 的字体大小 高度和宽度 目前要分割我使用的文本 onView withId R id editText1 perform clearText typeText Amr 并阅读文本 onVi
  • 如何将图像从 Android 应用程序上传到网络服务器的特定文件夹中

    如何将图像从 android 移动到 Web 服务器上的指定文件夹 这是我的安卓代码 package com example bitmaptest import java io ByteArrayOutputStream import ja
  • 无法运行我的应用程序,要求选择 Android SDK

    今天我已经安装了Android Studio 金丝雀 1 现在我无法运行我的应用程序 将出现以下对话框 我已经通过 文件 gt 项目结构 gt Android SDK 位置 设置了正确的 SDK 位置 期待您的帮助来解决这个问题 警告对话框

随机推荐