创建线程
- 继承Thread
class MyThread extends Thread {
@Override
public void run() {
super.run();
for (int i = 0; i < 50; i++) {
Log.e(TAG, "run: " + i);
}
}
}
new MyThread().start();
- 实现Runable接口重写run方法
class MyRunnable implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
Log.e(TAG, "run: " + i);
}
}
}
new Thread(new MyRunnable()).start();
需求
异步执行完成后更新UI
- 通过View或者Activity更新UI
class MyThread extends Thread {
private TextView textView;
MyThread(TextView textView) {
this.textView = textView;
}
@Override
public void run() {
super.run();
final long startTime = System.currentTimeMillis();
//模拟耗时操作
for (int i = 0; i < 1000; i++) {
Log.e(TAG, "run: " + i);
}
//更新ui的方法
//1.Activity.runOnUiThread(Runnable)
runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
//2.View.post(Runnable)
textView.post(new Runnable() {
@Override
public void run() {
long entTime = System.currentTimeMillis();
long l = entTime - startTime;
textView.setText(MessageFormat.format("耗时: {0} ms", l));
}
});
//3.View.postDelayed(Runnable, long)
textView.postDelayed(new Runnable() {
@Override
public void run() {
textView.setText("postDelayed");
}
}, 5000);
}
}
- 通过Handler
private MyHandler myHandler;
private static class MyHandler extends Handler {
private String TAG = "MyHandler";
private TextView textView;
MyHandler(TextView textView) {
this.textView = textView;
}
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
String text = (String) msg.obj;
textView.setText(text);
}
}
class MyThread extends Thread {
private TextView textView;
MyThread(TextView textView) {
this.textView = textView;
}
@Override
public void run() {
super.run();
final long startTime = System.currentTimeMillis();
//模拟耗时操作
for (int i = 0; i < 1000; i++) {
Log.e(TAG, "run: " + i);
}
//更新ui的方法
//4.Handler
Message message = new Message();
message.obj = "123456";
myHandler.sendMessage(message);
}
}
myHandler = new MyHandler(textView);
new MyThread(textView).start();
子线程同步问题
new Thread().start();
new Thread().start();
new Thread().start();
如果想多个异步线程顺序执行,上面这种方法是不行的
handlerThread
HandlerThread适合处理本地IO读写操作(数据库,文件),因为本地IO操作大多数的耗时属于毫秒级别,对于单线程 + 异步队列的形式 不会产生较大的阻塞。而网络操作相对比较耗时,容易阻塞后面的请求,因此在这个HandlerThread中不适合加入网络操作。
private HandlerThread handlerThread;
private MyHandler myHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
//....
handlerThread = new HandlerThread("handler_thread");
handlerThread.start();
myHandler = new MyHandler(handlerThread.getLooper());
myHandler.sendEmptyMessage(1);
myHandler.sendEmptyMessage(2);
}
@Override
protected void onDestroy() {
super.onDestroy();
handlerThread.quitSafely();
}
private static class MyHandler extends Handler {
private String TAG = "MyHandler";
MyHandler(@NonNull Looper looper) {
super(looper);
}
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 1:
Log.e(TAG, "case1Start: ");
for (int i = 0; i < 100; i++) {
Log.e(TAG, "case1: " + i);
}
Log.e(TAG, "case1Finish: ");
break;
case 2:
Log.e(TAG, "case2Start: ");
for (int i = 0; i < 100; i++) {
Log.e(TAG, "case2: " + i);
}
Log.e(TAG, "case2Finish: ");
break;
}
}
}
通过上面代码可以知道HandlerThread可以达到顺序执行的效果。
AsyncTask
线程池 SingleThreadExecutor
溜溜球