Android知识体系(2)

2022-08-03  本文已影响0人  不会弹吉他的二郎腿

Android知识体系(1)
Android知识体系(2)

十一.Handler机制

1、定义&作用

定义:Android中线程之间消息传递、异步通信的机制。
作用:将工作线程的消息传递到UI主线程中,从而是实现工作线程对主线程的更新,避免线程操作的不安全。

2、原理

相关组件:
· Handler:消息处理者,添加消息Message到MessageQueue中,再通过Looper循环取出消息。
主要方法:handler.post()、handler.sendMessage()、handler.dispatchMessage()、handler.handleMessage()
· Message:存储需要操作的数据
· MessageQueue:存放消息的数据结构
主要方法:queue.enqueueMessage()
· Looper:消息循环
主要方法:looper.prepare()、looper.loop()

在主线程中创建Looper和MessageQueue,通过handler.sendMessage或者handler.post发送消息进入MessageQueue。
Looper不断的循环从消息队列中取出消息,发送给消息创建者handler。handler接收消息,在handleMessage方法中处理。


27C8A243-B380-4249-A873-FBEAC76DCA09.png

相关资料文章:
Android异步通信:手把手带你深入分析 Handler机制源码
Android异步通信:这是一份Handler消息传递机制的使用教程
Android 多线程:你的 Handler 内存泄露 了吗?

十二.自定义view

1、onMeasure 测量

作用:决定view的大小

2、onLayout 布局

作用:获取四个顶点,决定View的位置。

3、onDraw 绘制

作用:显示内容

4、invalidate/postInvalidate/requestLayout

5、ViewRoot/DecorView

6、View的绘制流程

7、getMeasuredHeight 和 getHeight 方法的区别(同理getMeasuredWith/getWith)

相关资料文章:
Android 绘制原理浅析【干货】

十三.多线程编程

1、为何有多线程?

2、AsyncTask

3、ThreadPool

4、IntentService

5、TreadLocal

6、java内存分区和java内存模型(JMM)

7、volatile

8、synchronized

9、ReentrantLock

10、Atomic原子类

相关资料文章:
ThreadLocal原理其实很简单
Java并发包中的Atomic原子类

十四.跨进程通信(IPC inter-process communication)

1、Binder机制

2、AIDL(android interface definition language) Android接口定义语言

相关资料文章:
Android Binder原理(一)

十五.图片相关(bitmap加载、处理、缓存)

1、Bitmap加载(本地、网络)

 private Bitmap returnBitmapFormUrl(String url) {
        long l1 = System.currentTimeMillis();
        Bitmap bitmap = null;
        HttpURLConnection connection = null;
        InputStream inputStream = null;
        URL myUrl = null;
        try {
            myUrl = new URL(url);
            connection = (HttpURLConnection) myUrl.openConnection();
            connection.setReadTimeout(6000);
            connection.setConnectTimeout(6000);
            connection.setDoInput(true);
            connection.connect();
            inputStream = connection.getInputStream();
            bitmap = BitmapFactory.decodeStream(inputStream);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(inputStream != null){
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            l1 = System.currentTimeMillis();
        }
        return bitmap;
    }

2、Bitmap处理(保存、压缩)

private void saveImageToFile(Context context, Bitmap bitmap) {
        File appDir = new File(Environment.getExternalStorageState(), "test");
        if (!appDir.exists()) {
            appDir.mkdir();
        }
        String fileName = System.currentTimeMillis() + ".jpg";
        File file = new File(appDir, fileName);
        try {
            FileOutputStream fos = new FileOutputStream(file);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
            fos.flush();
            fos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            MediaStore.Images.Media.insertImage(context.getContentResolver(), file.getAbsolutePath(), fileName, null);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        intent.setData(Uri.parse("file://"+file.getAbsolutePath()));
        context.sendBroadcast(intent);
    }

3、大图加载

4、图片缓存

5、图片占用内存

6、如何避免加载图片出现OOM?

上一篇下一篇

猜你喜欢

热点阅读