实现异步的方式
Java Thread
// 1. 实现Runnable接口
new Thread(new Runnable() {
@Override
public void run() {
// code
}
}).start();
// 2. 直接继承Thread
public class MyThread extends Thread{
@Override
public void run() {
super.run();
}
}
缺点是无法获取执行结果
Future + ExecutorService
在 Android 中使用的时候要注意在子线程中执行,因为在主线程中直接调用结果获取的方法会阻塞线程。
Future(FutureTask) 作用:
- 判断任务是否完成;
- 能够中断任务;
- 能够获取任务执行结果。
mExecutorService = Executors.newCachedThread
mStringFutureTask = new FutureTask<String>(new CString>() {
@Override
public String call() throws Exception {
Thread.sleep(8000);
return "result";
}
});
mExecutorService.execute(mStringFutureTask);
try {
String s = mStringFutureTask.get();
Log.d(TAG, "onCreate:
// close executorService
mExecutorService.shutdown();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
优点:
- 能够获取任务结果
- 在多任务的情况下方便管理
AsyncTask
但凡和线程池/线程/同步/锁等有关的实践问题,尽量不要用 Android 的解决方案,如 AsyncTask,而要用 Java 中已经历经考验的实践方案
是适合当个任务,在多个异步任务并行的情况下不方便管理
IntentService
ExecutorService 管理异步任务
一个例子 使用多线程计算 1+2...+100
private void startCalculate() {
sum += 100;
for (int i = 0; i < 10; i++) {
final int finalI = = 0;
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (MainActivity.this) {
int from = (100 / 10) * finalI;
int to = (100 / 10) * (finalI + 1);
for (int j = from; j < to; j++) {
sum += j;
}
}
result(Thread.currentThread().getNamesum);
}
}, "Thread" + i);
thread.start();
}
}
volatile long sum = 0;
private void result(String name, long sum) {
Log.d(TAG, name + "result: " + sum);
}
- result 方法作为结果回调,可以在 result 中记录已经结束的线程,同时判断是不是所有线程都执行结束了
- error 可以增加一个 error 方法回调,记录哪个线程执行的任务失败了
参考: