OK,基本原理已经了解了 , 现在我们来手搓一个AsyncTask
class DownloadTask extends AsyncTask {@Overrideprotected void onPreExecute() {//这里我们使用了一个显示进度的Dialog,具体实现不表progressDialog.show();}@Overrideprotected Boolean doInBackground(Void... voids) {try {while (true){//调用我们的doDownload下载方法,具体实现不表int downloadPercent = doDownload();//使用publishProgress方法来更新执行的进度publishProgress(downloadPercent);if (downloadPercent >= 100)break;}} catch (Exception e) {e.printStackTrace();}return true;}@Overrideprotected void onProgressUpdate(Integer... values) {//更新下载进度progressDialog.setMessage("Download " values[0] "%");}@Overrideprotected void onPostExecute(Boolean aBoolean) {//下载完成progressDialog.dismiss();}}这里我们创建了一个Download类继承自AsyncTask , 有三个泛型,void表示不需要给后台任务传入参数,Integer表示用整数类型来作为进度显示的单位,Boolean表示用布尔类型来反馈后台任务的执行结果 。
要让我们的这个AsyncTask跑起来也很简单,只需要执行:
new DownloadTask().execute();
2.5 IntentService
IntentService是一种特殊的Service , 它继承了Service并且是一个抽象类,我们可以创建它的子类来使用 。IntentService也可以用于执行后台的耗时任务,并且当任务执行完毕之后它会自动停止 。
IntentService因为是服务的原因,所以和单纯的线程相比它的优先级要高很多,从而更不容易被系统杀死 。
IntentService的内部实现是封装了HandlerThread和Handler,使用的话要遵循Service的使用方法,这里先略过后面有机会在Service的专栏里面再详细介绍 。
2.6 RxJava
有杠精可能会说,你讲的这些方法,一个比一个长,一个比一个复杂,就不能整个简单又粗暴的东西?
这个时候就需要祭出神兵利器RxJava了 。
2.6.1 RxJava又是个啥?其实网络上RxJava的入门文章多如过江之鲫,这里不打算过多的深入介绍 。RxJava是一种响应式编程,大家不是很明白的话可以粗暴的理解为更优雅的多线程实现即可 。
2.6.2 那怎么操作RxJava?先手搓一个RxJava的普通实现方式
private void fun(){Observable observable = Observable.create(new ObservableOnSubscribe() {@Overridepublic void subscribe(ObservableEmitter emitter) throws Exception {emitter.onNext(1);}});observable.subscribeOn(Schedulers.io()) //表示在io线程执行订阅.observeOn(AndroidSchedulers.mainThread()) //表示在主线程接收订阅.subscribe(new Observer() {@Overridepublic void onSubscribe(Disposable d) {//接收订阅之前调用}@Overridepublic void onNext(Integer integer) {//接收订阅成功调用doSomething();}@Overridepublic void onError(Throwable e) {//接收订阅出错调用}@Overridepublic void onComplete() {//接收订阅完成调用}});}emmmmm看起来好像还是挺复杂的啊,能不能再整简单点?
OK , 链式调用加lambda安排上
private void fun() {Observable.create(emitter -> emitter.onNext(1)).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(integer -> {//接收订阅成功doSomething();}, throwable -> {});}嗯......有内味了 。
这串代码我们是发送了一个Integer类型的数据;
subscribeOn()指定了我们发送的线程是在后台的io线程,就可以理解为一个子线程;
observeOn指定了我们接收的线程为主线程;
subscribe只接收成功的消息 , 相当于上面的OnNext()方法,本质上是我们在这里创建了一个Comsumer对象来接收;
throwable在接收失败的时候调用,相当于上面的onError()方法 。
RxJava有多达几十种的操作符,灵活运用能实现各种不同的异步任务,这里就不再花大量的篇幅详细介绍了 , 有兴趣的朋友可以去查看ReactiveX中文文档
- “海马体”长度不到10厘米 竟能偷走人类的记忆力
- 科学家揭秘:人类基因是肢体再生的关键
- 娜迦毒蛇,不是蛇而是世界上最辣的辣椒
- 世界最强十大航母:美航母还能领先多少年?
- 地球上的生物为何要依赖氧气生存?氧气是怎么产生的
- 大脑的奥秘,科学揭秘人类大脑如何一心二用!
- 破解挑战者号背后的五大惊天谜团?
- 形容自己再做也得不到重视的成语
- 形容一次又一次的发生的成语
- 形容声音吵很烦躁的成语