IntentService意图服务 源码解读

基本概念

IntentService作用

IntentService是Service类的子类,常用来在后台执行耗时的异步请求。我们不用去关心Service的创建和销毁的细节。也不用单独开线程,只管处理自己的任务,处理完过后系统会自动销毁该服务,启动IntentService的方式和普通Service相同,但是使用起来却极其简单。使用示例如下:

AsyncTask异步任务 源码解读

之前我们介绍了Handler的一些基本用法,也解读了Handler的源码。通过Handler我们可以简便的切换到主线程进行UI操作。而AsyncTask的出现使我们不用去关心线程管理和切换的一些细节,我们可以更轻松的去操作UI。

基本概念

AsyncTask异步任务的作用

AsyncTask,见名之意,异步任务。允许我们在后台做一些耗时操作,然后切换到主线程更新,而且这一过程变得非常简便。一提到异步任务,我们的第一反应就是多线程。假如我们现在需要去下载一张图片,然后在界面上显示,如果没有AsyncTask,我们的异步操作可能就会这么写:

Handler消息机制 源码解读

基本概念

Handler消息机制的作用

大家知道子线程没有办法对UI界面上的内容进行操作,如果操作,将抛出异常,为了让子线程能间接操作UI界面,Android中引入了Handler消息传递机制,通过Handler切换到主线程进行UI操作。

Handler、Looper、MessageQueue、Message的关系是什么?

  • Handler用于发送和处理消息。而发出的Message经过一系列的周转后,最终会传递回Handler中,最后更新UI。

  • Message是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之前交换数据。

  • MessageQueue是消息队列,用于存放Message。Message在消息队列中,等待Looper取出。每个线程中只会有一个MessageQueue对象。

  • Looper是每个线程中的MessageQueue的管家,调用Looper的loop()方法后,就会进入一个无限循环中,每当MessageQueue中存在一个Message,Looper对象就会将其取出,传递到Handler中进行处理。每个线程中只会有一个Looper对象。

JAVA 8 Lambda表达式完全解析

JAVA8 新特性

在学习JAVA8 Lambda之前,必须先了解一下JAVA8中与Lambda相关的新特性,不然对于一些概念会感到比较陌生。

1、 接口的默认方法和静态方法
Java 8允许我们给接口添加一个默认方法,用default修饰即可。默认方法可以重写,也可以不用重写。这就是和抽象方法的区别,在用法上,没有其他区别。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public interface IMyInterface {
void onMethond(String str);//这是一个抽象方法
default String onDefalutMethod(){//这是一个默认方法
return "这是一个默认方法";
}
}
//重写默认方法
public class MyImpl1 implements IMyInterface {

@Override
public void onMethond(String str) {
// TODO Auto-generated method stub

}
@Override
public String onDefalutMethod() {
return "重写默认方法";
}

}
//不重写默认方法
public class MyImpl2 implements IMyInterface {

@Override
public void onMethond(String str) {
// TODO Auto-generated method stub
}
}

此外Java 8还允许我们给接口添加一个静态方法,用static修饰即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
public interface IMyInterface {

void onMethond(String str);//这是一个抽象方法

default String onDefalutMethod(){//这是一个默认方法
return "这是一个默认方法";
}

static String onStaticMethod(){
return "这是一个静态方法";
}

}

Android中常见的XML解析方式

基本概念

  1. 概念:extensive markup language(可扩展的标记语言)
    XML是一种通用的数据存储和交换格式,与平台无关,与编程语言无关,与操作系统无关。给数据集成和交互提供了极大的便利。
    将数据格式化成XML文件后,真正实现了数据跨平台的交互和共享。在不同语言中,xml的解析方式都一样。

  2. XML文件格式
    1.每个xml文件中要有一个,且只能有一个xml根节点;
    2.xml文件的数据中不可以 出现”< “或者” >”;

自定义View系列(一)基本概念

一直对于自定义view没有进行深入研究过,最近抽空开始整理整理自定义view相关的知识,以便可以有个系统的深入的认识,也希望能够给初学者一点启示。

本篇主要介绍自定义view中一些相关API以及相关知识点。

初识Canvas和Paint

  • Paint,画笔类。
    常用API如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //设置画笔的颜色
    mPaint.setColor(int color);
    //设置填充风格,Paint.Style.FILL(仅填充),Paint.Style.STROKE(仅描边),Paint.Style.FILL_AND_STROKE(同时描边和填充)
    mPaint.setStyle();
    //设置描边宽度
    mPaint.setStrokeWidth()
    //设置字体大小
    mPaint.setTextSize();
    //重置画笔
    mPaint.reset();
    //设置滤镜
    mPaint.setColorFilter();
    //设置混合模式
    mPaint.setXfermode();

Android ImageView长按保存图片及截屏相关知识

在日常开发中,可能会需要做长按保存图片这个功能,又或者需要做个截屏分享功能。最近正好在研究这些东西,写篇博客整理一下。

view长按保存图片的几种方式

如果是网络图片,我们可以直接选择将图片下载下来后保存,这种方式,简单暴力,可以直接获得原图,本质其实就是下载文件。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
public static boolean  downloadBitmap(String urlString, File fileDir) {
URL url = null;
InputStream is = null;
FileOutputStream fos = null;
HttpURLConnection conn=null;
boolean isSuccess=false;
try {

url = new URL(urlString);
//开启连接
conn = (HttpURLConnection) url.openConnection();
//设置超时的时间,5000毫秒即5秒
conn.setConnectTimeout(5000);
//设置获取图片的方式为GET
conn.setRequestMethod("GET");
conn.connect();
//响应码为200,则访问成功
if (conn.getResponseCode() == 200) {
//获取连接的输入流,这个输入流就是图片的输入流
is = conn.getInputStream();
if (!fileDir.exists()) {
fileDir.mkdirs();
}
String fileName = urlString.substring(urlString.lastIndexOf("/") + 1); //根据链接获取文件名
File file = new File(fileDir, fileName);
fos = new FileOutputStream(file);
int len;
byte[] buffer = new byte[1024];
//将输入流写入到我们定义好的文件中
while ((len = is.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
//将缓冲刷入文件
fos.flush();
isSuccess=true;

}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(fos!=null){
fos.close();
}
if(is!=null){
is.close();
}

if(conn!=null){
conn.disconnect();
}

} catch (IOException e) {
e.printStackTrace();
}
}

return isSuccess;

}