1. ScrollView滚动
handler.post(new Runnable() {
@Override
public void run() {
scrollView.fullScroll(ScrollView.FOCUS_DOWN); //滚动到底部 FOCUS_UP 到顶部
}
});
2、安卓提示
- 2.1 在低版本上运用Material Design风格的Dialog,引用android.support.v7.app.AlertDialog
- 2.2 Toast 防止连续点击,多次弹出
public final class ToastUtil
{
private static Toast toast;
/**
* <显示用户所传信息> <功能详细描述>
*
* @see [类、类#方法、类#成员]
*/
public static void makeText(Context mContext, String msg)
{
if (toast == null) {
toast = Toast.makeText(mContext,
msg,
Toast.LENGTH_SHORT);
} else {
toast.setText(msg);
}
toast.show();
}
- 2.3 Toast 防止连续点击,多次弹出
3 混淆
借助SDK中自带的Proguard工具,只需要修改build.gradle中的一行配置即可。可以看到,现在build.gradle中minifyEnabled的值是false,这里我们只需要把值改成true,加上proguard-rules文件,打出来的APK包就会是混淆过的了
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
4、Application context
Application是属于系统组件,系统组件的实例是要由系统来去创建的,如果这里我们自己去new一个MyApplication的实例,它就只是一个普通的Java对象而已,而不具备任何Context的能力。Application本身就是单例
public class MyApplication extends Application {
private static MyApplication app;
public static MyApplication getInstance() {
return app;
}
@Override
public void onCreate() {
super.onCreate();
app = this;
}
}
5 加载图片所占内存大小
内存=图片长度图片宽度单位像素占用的字节数
图片格式(Bitmap.Config) 占用内存的计算方向 一张100*100的图片占用内存的大小
ALPHA_8 图片长度*图片宽度 100*100=10000字节
ARGB_4444 图片长度*图片宽度*2 100*100*2=20000字节
ARGB_8888 图片长度*图片宽度*4 100*100*4=40000字节
RGB_565 图片长度*图片宽度*2 100*100*2=20000字节
6 equal和==的区别
==与equals的主要区别是:==常用于比较原生类型,而equals()方法用于检查对象的相等性。
另一个不同的点是:如果==和equals()用于比较对象,当两个引用地址相同,==返回true。而equals()可以返回true或者false主要取决于重写实现。
最常见的一个例子,字符串的比较,不同情况==和equals()返回不同的结果。
equals()方法最重要的一点是,能够根据业务要求去重写,按照自定义规则去判断两个对象是否相等。
重写equals()方法的时候,要注意一下hashCode是否会因为对象的属性改变而改变,否则在使用散列集合储存该对象的时候会碰到坑!!理解equals()方法的存在是很重要的。
使用==比较有两种情况:
比较基础数据类型(Java中基础数据类型包括八中:short,int,long,float,double,char,byte,boolen):这种情况下,==比较的是他们的值是否相等。 引用间的比较:在这种情况下,==比较的是他们在内存中的地址,也就是说,除非引用指向的是同一个new出来的对象,此时他们使用`==`去比较得到true,否则,得到false。
使用equals进行比较:
equals追根溯源,是Object类中的一个方法,在该类中,equals的实现也仅仅只是比较两个对象的内存地址是否相等,但在一些子类中,如:String、Integer 等,该方法将被重写。
7 使用Glide进行图片压缩
// 先从本地获取图片,利用Glide压缩图片后获取byte[]
Glide.with(context).load(uri).asBitmap().toBytes().into(
new SimpleTarget<byte[]>(reqW, reqH)
{
@Override
public void onResourceReady(final byte[] resource, GlideAnimation<? super byte[]> glideAnimation)
{
// 上传图片
RequestBody requestBody = RequestBody.create(MediaType.parse("image/jpeg"), resource);
Observable<FileUploadResponse> observable = service.fileUpload(filename, requestBody);
ObservableDecorator.decorate(observable)
.subscribe(call);
}
@Override
public void onLoadFailed(Exception e, Drawable errorDrawable)
{
super.onLoadFailed(e, errorDrawable);
call.onError(new Throwable("图片解析失败"));
}
});
上面是获取到二进制的图片了,再将byte->bitmap就可以
Java代码
private byte[] Bitmap2Bytes(Bitmap bm){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
return baos.toByteArray();
}
private byte[] Bitmap2Bytes(Bitmap bm){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
return baos.toByteArray();
}
4、 byte[] → Bitmap
Java代码
private Bitmap Bytes2Bimap(byte[] b){
if(b.length!=0){
return BitmapFactory.decodeByteArray(b, 0, b.length);
}
else {
return null;
}
}
8 ImageView圆角设置
效果比如说,ImageView上面是圆角,下方是直角
public class RoundedImageView extends ImageView
{
/*圆角的半径,依次为左上角xy半径,右上角,右下角,左下角*/
private float[] rids = {10.0f,10.0f,10.0f,10.0f,0.0f,0.0f,0.0f,0.0f,};
public RoundedImageView(Context context) {
super(context);
}
public RoundedImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public RoundedImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
/**
* 画图
* by Hankkin at:2015-08-30 21:15:53
* @param canvas
*/
protected void onDraw(Canvas canvas) {
Path path = new Path();
int w = this.getWidth();
int h = this.getHeight();
/*向路径中添加圆角矩形。radii数组定义圆角矩形的四个圆角的x,y半径。radii长度必须为8*/
path.addRoundRect(new RectF(0,0,w,h),rids,Path.Direction.CW);
//一定要记住clip是针对canvas的剪切而非图形
canvas.clipPath(path);
super.onDraw(canvas);
}
}
9、概念
Java的运算符,分为四类:
算数运算符、关系运算符、逻辑运算符、位运算符。
算数运算符(9):+ - * / % ++ –
关系运算符(6):== != > >= < <=
逻辑运算符(6):&& || ! ^ & |
位运算符(7):& | ~ ^ >> << >>>
Java基本数据类型:
数值类型:
整型:byte、short、int、long
非整型:double、float
非数值类型:char[字符]、boolean[布尔]
10、内存泄露、内存溢出
1、内存泄漏:
当出现对Activity、View或drawable等类的对象长期持有无用的引用,就会造成被引用的对象无法在GC时回收,而是长期占用堆空间,此时就会发生内存泄漏。程序运行时不断消耗内存,最终导致OutOfMemery,程序异常退出,这就是内存泄露导致的。简单来说,就是保留下来却永远不再使用的对象引用。
2、内存溢出:
如果应用程序在消耗光了所有的可用堆空间,那么再试图在堆上分配新对象时就会引起OOM(Out Of Memory Error)异常,此时应用程序就会崩溃退出。
原因:
资源对象没关闭造成的内存泄露。
查询数据库而没有关闭Cursor
注册没取消造成的内存泄漏调用registerReceiver后未调用unregisterReceiver().
未关闭InputStream/OutputStream
在使用文件或者访问网络资源时,使用了InputStream/OutputStream也会导致内存泄露
Bitmap使用后未调用recycle()
持有Context引用造成的泄漏。
线程之间通过Handler通信引起的内存泄漏
将变量的作用域设置为最小
构造Adapter时,没有使用缓存的convertView如果你想保持一个长期生存的对象,并且这个对象需要一个context,记得使用application对象。
集合中对象没清理造成的内存泄漏