https://mp.weixin.qq.com/s/Dt4zKqfLc6jrl22HaXy3Fw
多线程方式
基石:Handler
Handler是一种线程发消息的机制,Looper被线程持有,保存在ThreadLocal中,一个线程一个Looper(需要时候创建),在A线程创建Handler,Handler就会使用A线程拥有的Looper(创建MessageQueue和从MessageQueue中loop循环取消息)。
总结创建handler需要Looper,什么线程创建Handler就会拿什么线程的Looper,也可以直接指定Looper。一个线程的Looper可以用来创建多个Handler,可以被共用,但是MessageQueue中取消息总是可以根据消息的target送到指定的Handler中来处理。很多场景会共用Looper,比如这里的AsyncTask就共用了main UI线程的Looper,使得onPostExecute和onProgressUpdate可以运行在主线程。
AsyncTask
ThreadPoolExecutor
IntentService
RxJava Kotlin协程
AsyncTask
弃用使用方法
文档继承该抽象类
public class CountTask extends AsyncTask<String,Integer,String> {
private Context context;
public CountTask(Context context) {
this.context = context;
}
@Override
protected String doInBackground(String... strings) {
Log.i("gong",Thread.currentThread().getName());
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(1000);
publishProgress(i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
@Override
protected void onPostExecute(String s) {
Toast.makeText(context,"后台计数结束!",Toast.LENGTH_SHORT).show();
}
@Override
protected void onProgressUpdate(Integer... values) {
Log.i("gong","进度:"+values[0]);
}
}
Activity中使用
//并行执行AsyncTask 其内部有两个线程池 一个是串行执行线程池,一个是并行执行线程池
new CountTask(MainActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, "hello");
new CountTask(MainActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, "hello");
优点
- 在后台执行操作后可以很轻松操作更新UI.
缺点
- 内存泄漏(doInBackground方法结束控制)
- Activity销毁后更新UI失效
- 崩溃,AsyncTask中的线程池是静态创建共享的单例,所有的子类都共用。
网友评论