Android——知识点备忘

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()方法的存在是很重要的。

  1. 使用==比较有两种情况:

    比较基础数据类型(Java中基础数据类型包括八中:short,int,long,float,double,char,byte,boolen):这种情况下,==比较的是他们的值是否相等。
    引用间的比较:在这种情况下,==比较的是他们在内存中的地址,也就是说,除非引用指向的是同一个new出来的对象,此时他们使用`==`去比较得到true,否则,得到false。
    
  2. 使用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(); 
   } 
4byte[] → 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对象。
集合中对象没清理造成的内存泄漏

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值