知识点目录
知识点回顾
10.1 服务是什么
服务(Service)是Android中实现程序后台运行的解决方案。它非常适合去执行一些不需要和用户交互而且还要求长期运行的任务。
-
服务并不是运行在独立的进程中,而是依赖创建服务时所在的应用程序进程
-
服务并不会自动开启线程,所有的代码都是默认运行在主线程中。
正常情况下,我我们都需要手动创建子线程,并在子线程中执行具体的任务,否则就有可能出现主线程被阻塞住的情况。
10.2 Android多线程编程
当我们需要执行一些耗时操作(例如:网络请求)时,都会将这些操作放在子线程中去运行,否则容易被阻塞住,从而影响用户对软件的正常使用。
10.2.1 线程的基本用法
创建线程的方式一般有如下两种:
1. 继承Thread
新建一个类继承Thread,然后重写父类的run()方法,在run()方法里面写耗时逻辑。
public class MyThread extends Thread {
@Override
public void run() {
// 处理具体的逻辑
}
}
然后new出一个MyThread实例,调用它的start()方法,这样run()方法中的代码就会在子线程中运行。
new MyThread().start();
2. 实现Runnable接口
继承的耦合性太高,我们可以通过实现Runnable接口的方式来定义一个线程。
public class MyThread implements Runnable {
@Override
public void run() {
// 处理具体的逻辑
}
}
启动线程的方式如下:
MyThread myThread = new MyThread();
new Thread(myThread).start();
3. 匿名类
如果不想去专门再定义一个类去实现Runnable接口,那么也可以使用匿名类的形式,这种方式更加常见。
new Thread(new Runnable() {
@Override
public void run() {
// 处理具体的逻辑
}
}).start();
10.2.2 在子线程中更新UI
下面我们写一个Demo在子线程中更新UI看看效果。
1.布局文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/change_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:text="Change text"/>
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textAllCaps="false"
android:text="Hello world"
android:textSize="20sp&