安卓学习-性能最佳实战
2019独角兽企业重金招聘Python工程师标准>>>
一.内存管理技巧
1.推介使用IntentService
7.直接用ArrayList 不用List
二.高性能编码技巧
静态方法属于类,既可以通过类引用也可以通过创建对象来引用,
静态方法和非静态方法 都存放在代码区,静态方法是类方法,不用创建对象,直接拿来就用,而非静态方法是对象方法,
需要创建对象,然后用对象去访问。
静态方法可以直接用类名点出来方法,而普通方法需要创建类的对象后才能调用!
静态的方法和变量会调用时在内存生成一个唯一的标示,你可以理解成在物理内存中给静态一个位子,
这样的话在调用的时候可以直接找到,而且会节省内存,但是如果你声明的静态过多的话那么每一个都会在内存有一个位子,
那么你就没有资源运行别的,会报内存溢出!
普通方法是由java的gc机制(垃圾回收机制)来控制,可能同一个对象或变量在使用的过程中,这个时间的在内存占了一个位子,
而上个时间的还没有从内存中删除,这样的话就可能有2个一样的在内存中,这个2个一样东西只是内容值一样,但是内存值不一样,
你可以用"=="和"equals"来查看(这个只适用对象和String类型).java的gc机制会根据运行时的内存状态来自动清除一些用不到变量或对象,
就算你手动调用gc也是一样的!
10.成员变量存在堆中 本地变量存在栈中,访问栈比访问堆快
三.布局性能优化_hierarchyviewer工具与重用布局,ViewStub
能用RelativeLayout布局优化比LinearLayout更好,优化
案例:
点击标题栏在点击标题栏
实现ViewStub隐藏与显示
大家写项目的时候肯定会有一些东西提前写好,但是不到一定条件是不想让它显示出来的,我们可能的做法就是让它 View . GONE 或 View .INVISIBLE 等到一定条件了在代码里面这设置 View .VISIBLE 虽然这样写起来也挺方便的,也符合逻辑,但是这个条件是八百年都不出一次,你这么写就有点大才小用了,因为你事先布局好的Inflate, 也就是说 也就是说仍然会创建对象,会被实例化,会被设置属性。也就是说,会耗费内存等资源。
推荐的做法是使用 android.view.ViewStub ,ViewStub是一个轻量级的View,它一个看不见的,不占布局位置,占用资源非常小的控件。可以为ViewStub指定一个布局,在Inflate布局的时候,只有ViewStub会被初始化,然后当ViewStub被设置为可见的时候,或是调用了ViewStub.inflate()的时候,ViewStub所向的布局就会被Inflate和实例化,然后ViewStub的布局属性都会传给它所指向的布局。这样,就可以使用ViewStub来方便的在运行时,要还是不要显示某个布局。
但ViewStub也不是万能的,下面总结下ViewStub能做的事儿和什么时候该用ViewStub,什么时候该用可见性的控制。
首先来说说ViewStub的一些特点:
1. ViewStub只能Inflate一次,之后ViewStub对象会被置为空。按句话说,某个被ViewStub指定的布局被Inflate后,就不会够再通过ViewStub来控制它了。
2. ViewStub只能用来Inflate一个布局文件,而不是某个具体的View,当然也可以把View写在某个布局文件中。
基于以上的特点,那么可以考虑使用ViewStub的情况有:
1. 在程序的运行期间,某个布局在Inflate后,就不会有变化,除非重新启动。
因为ViewStub只能Inflate一次,之后会被置空,所以无法指望后面接着使用ViewStub来控制布局。所以当需要在运行时不止一次的显示和隐藏某个布局,那么ViewStub是做不到的。这时就只能使用View的可见性来控制了。
2. 想要控制显示与隐藏的是一个布局文件,而非某个View。
因为设置给ViewStub的只能是某个布局文件的Id,所以无法让它来控制某个View。
所以,如果想要控制某个View(如Button或TextView)的显示与隐藏,或者想要在运行时不断的显示与隐藏某个布局或View,只能使用View的可见性来控制。
下面就说一个例子,这个例子是这样的,我们先用 ViewStub把xml布好,这显然不会被 Inflate,我们在代码让他显示出来,但是突然条件有不符合了,我必须把显示的东西还得把它隐藏掉,但是这个时候 ViewStub已经被销毁了,已经不能再用了,这个时候我们还得用GONE和VISIBLE来控制显示和隐藏。
title_bar.xml
<?xml version="1.0" encoding="utf-8"?><merge xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/holo_blue_dark">
<ImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/imageView" android:src="@mipmap/ic_launcher" /></merge>
inc.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent">
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:id="@+id/button_back" android:layout_alignParentTop="true" android:text="返回" />
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="完成" android:id="@+id/button_ok" android:layout_alignParentTop="true" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" /></RelativeLayout>
item_layout2.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent">
<TextView android:layout_width="71dp" android:layout_height="wrap_content" android:text="New Text" android:id="@+id/textView_title" android:layout_gravity="center_horizontal" android:layout_alignParentTop="true" android:layout_toRightOf="@+id/imageView2" android:layout_toEndOf="@+id/imageView2" />
<ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageView2" android:src="@mipmap/ic_launcher" />
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New Text" android:id="@+id/textView_content" android:layout_alignBottom="@+id/imageView2" android:layout_toRightOf="@+id/imageView2" android:layout_toEndOf="@+id/imageView2" />
</RelativeLayout>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.administrator.hierarchyviewer.MainActivity">
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/holo_blue_dark" android:orientation="vertical">
<ViewStub android:id="@+id/stub_import" android:layout_width="match_parent" android:layout_height="wrap_content" android:inflatedId="@+id/stub_import" android:layout="@layout/inc"
/>
<include layout="@layout/title_bar"></include> </LinearLayout>
<ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="wrap_content" /></LinearLayout>
MainActivity.java
package com.example.administrator.hierarchyviewer;
import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.view.ViewStub;import android.widget.ImageView;import android.widget.ListView;import android.widget.SimpleAdapter;
import java.util.ArrayList;import java.util.HashMap;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{private ImageView imageView; private ViewStub vs; private boolean b=true; private boolean a=true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView= (ImageView) findViewById(R.id.imageView); vs=(ViewStub)findViewById(R.id.stub_import); imageView.setOnClickListener(this); ListView lv=(ListView)findViewById(R.id.listView); ArrayList<HashMap<String,String>> list=new ArrayList<>(); for (int i=1;i<20;i++) { HashMap<String,String> map=new HashMap<>(); map.put("title","title-"+i); map.put("content","content-"+i); list.add(map); } SimpleAdapter simpleAdapter=new SimpleAdapter(this, list,R.layout.item_layout2 ,new String[]{"title","content"},new int[]{R.id.textView_title,R.id.textView_content}); lv.setAdapter(simpleAdapter); }
@Override public void onClick(View v) { if (v.getId()==R.id.imageView) { //可见 // vs.setVisibility(View.VISIBLE); //或者 // View v=vs.inflate(); if(b){//条件符合 显示布局 vs.inflate(); b=false; }else{ if(a){//条件不符合 这个viewStub已经回收了所以我们只能用GONE和VISIBLE vs.setVisibility(View.GONE); a=false; }else{//条件符合 vs.setVisibility(View.VISIBLE); a=true; }
} } }}
转载于:https://my.oschina.net/xiaofeiandroid/blog/659039
安卓学习-性能最佳实战相关推荐
- 《高楼的性能工程实战课》学习所推荐的知识点
文章目录 <高楼的性能工程实战课>学习所推荐的知识点 一.操作系统类 <性能之颠:洞悉系统.企业与云计算> <深入理解LINUX内核(第3版)> <嵌入式Li ...
- 推荐学习-Linux性能优化实战
学习交流加(可免费帮忙下载CSDN资源): 个人微信: liu1126137994 学习交流资源分享qq群1(已满): 962535112 学习交流资源分享qq群2: 780902027 推荐一个学习 ...
- Linux性能优化实战学习笔记:第四十六讲=====实战分析
Linux性能优化实战学习笔记:第四十六讲 一.上节回顾 不知不觉,我们已经学完了整个专栏的四大基础模块,即 CPU.内存.文件系统和磁盘 I/O.以及网络的性能分析和优化.相信你已经掌握了这些基础模 ...
- 安卓学习专栏——实战项目酷欧天气(4)给天气页面加上背景图片
步骤 系列文章 前言 实现效果 项目结构 1.获取必应每日一图 1.1修改修改activity_weather.xml 1.2修改WeatherActivity 2.背景图和状态栏效果修改 2.1修改 ...
- 安卓学习专栏——实战项目酷欧天气(2)遍历全国省市县数据
步骤 系列文章 前言 1.实现效果 2.项目结构 util包 util包下新建HttpUtil util包下新建Utility 3.新建choose_area.xml布局 4.新建ChooseArea ...
- Linux性能优化实战学习笔记:第十讲==中断
Linux性能优化实战学习笔记:第十讲 一.坏境准备 1.拓扑图 2.安装包 在第9节的基础上 在VM2上安装hping3依奈包 ? 1 2 3 4 5 6 7 wget http://www.tcp ...
- linux性能优化实战学习笔记-(1)CPU性能分析工具与套路
版权归Linux性能优化实战 作者倪鹏飞,本文主要是为学习.整理相关知识点,请勿用作商用,侵删. linux性能分析工具 下图来自:Brendan D. Gregg http://www.brenda ...
- 学习Linux性能优化实战-1
文章目录 前言 平均负载 命令 进程调度 命令 相关文件 CPU使用率 perf 软中断 测试工具 前言 最近在极客时间上面发现了倪鹏飞老师的Linux性能优化实战,自己感觉讲得很好,有兴趣的朋友可以 ...
- 安卓学习文档收集汇总
安卓学习文档收集汇总 https://www.jianshu.com/p/86aed183ce6c?utm_campaign=maleskine&utm_content=note&ut ...
最新文章
- 日期控件判断是否为空
- SAP MM MIGO Return Delivery 组合实现部分数量的Reversal
- checksum命令 linux_关于Linux操作系统的一些命令是什么?
- Javascript实现AES加密解密(ECB/CBC)
- 前端基础git(一)-git入门代码版本控制介绍
- 《UNIX网络编程卷1》第一例及问题
- 蓝桥杯 卡片换位(bfs)
- 用MyEclipse测试发送email时报java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream
- Spring Framework 4.0 M1: WebSocket 支持
- summernote 字体名字不显示_觉得 Windows 10 显示字体不好看吗? 教你轻松更换成 Mac 字体版本。...
- 搭档之家:14天1.5万人民币!悉尼将征收入境隔离费
- c语言ab43错误的是,求助,AB+没法玩下去了,详情请看报错代码
- 【计算机视觉40例】案例14:指纹识别
- 初识智遥工作流软件——表单开发篇2
- 仿猫眼电影在线选座组件
- 词云图制作(wordcloud pyecharts)
- 鸿蒙os电脑界面,鸿蒙OS平板UI界面曝光:双Dock栏设计+超级终端互联功能
- 计算机二级C语言操作题怎么做?注意事项(难点易错点总结笔记)
- Oracle 踩坑记录
- 写作中的英文标点符号
热门文章
- 我的笔记本电脑有一个自带的摄像头 可是开机后在我的电脑里没有这个图标
- windows1064安装oracle,在Windows 10系统下安装Oracle 11g数据库
- python爬虫如何配置动态爬虫代理
- zabbix4.0添加mysql报警_部署监控三剑客 Zabbix4.0 监控以及告警机制
- php使用 js格式解析,php 无限级数据JSON格式及JS解析_PHP教程
- vue引用js文件的多种方式
- 快速解决mongodb出现id重复问题
- 对order by的理解
- 教你如何查看 Git 提交中发生了什么变化
- Firewalld共享上网及本地yum仓库搭建步骤