多线程:
1.为什么要使用多线程:
①执行耗时操作:网络下载、大文件读写、数据库操作...;
②为了不阻塞用户界面,出现ANR;
2.多线程的使用:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new MyThread("传递字符串").start(); //实例化调用子线程并传参 } //创建子线程,继承主线程 private class MyThread extends Thread { private String text; //接收参数 public MyThread(String text) { this.text = text; } //通过子线程的run方法,创建消息(Message)并赋值,接着通过Handler的sendMessage方法传递消息到Handler的handleMessage方法做处理 public void run() { try { } catch (Exception e) { } } } }
Looper:
当应用程序的进程一创建时,系统就给该进程提供了一个Looper(死循环,内部维护消息队列)。
Looper不断地从消息队列中取消息,取到消息就发送给Handler,Handler根据收到的消息去修改UI。
① Handler:
1.本意:处理器、处理者、管理者、句柄;
2.功能:发送消息和处理消息
3.Handler消息处理机制:
4.Handler机制的关键对象:
①Message(消息):线程间传递的消息,可以在内部携带少量的信息;
②MessageQueue(消息队列):存放Handler发送的消息。每个线程只有一个MessageQueue;
③Handler(处理器):通过sendMessage()发送消息和handleMessage()处理消息
④Looper(MessageQueue管家):当调用loop()方法后进入无限循环,等待MessageQueue存在消息,则将其取出,并传递到Handler的handleMessage()中。每个线程只有一个Looper对象;
5.使用Handler和子线程与UI线程的IPC:
package com.example.mjon.myapplication;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private TextViewtv;
//消息类型
private static final int UPDATE = 0;
private static final int ERROR = 1;
//消息处理
private Handlerhandler = new Handler() {
@Override
public void handleMessage(Messagemessage) {
//分发处理
if (message.what== UPDATE) {
tv.setText(String.valueOf(message.obj));
} elseif(message.what == ERROR){
Toast.makeText(MainActivity.this, "出错!", Toast.LENGTH_SHORT).show();
}
}
};
@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv =(TextView) findViewById(R.id.tv);
new MyThread("修改显示文本信息").start(); //实例化调用子线程并传参
}
//创建子线程,继承主线程
private class MyThread extends Thread {
private Stringtext;
//接收参数
public MyThread(String text) {
this.text = text;
}
//通过子线程的run方法,创建消息(Message)并赋值,接着通过Handler的sendMessage方法传递消息到Handler的handlerMessage方法做处理
public void run() {
//创建消息对象,传递状态和信息
try {
Message message = new Message();
message.what= UPDATE; //设置消息类型
message.obj = text; //传递值
handler.sendMessage(message); //发送消息
} catch(Exception e) {
}
}
}
}
6.总结:主线程的职责是创建、显示和更新UI控件,处理UI事件、启动子线程、停止子线程;
子线程的职责是向主线程发出更新UI消息;
子线程和主线程通过Message和MessageQueue实现线程间的通信。