JAVA设计方法思考之如何实现一个方法执行完毕后自动执行下一个方法
今天编程时,突然想起来在一些异步操作或Android原生库的时候,需要我们实现一些方法,
这些方法只需要我们具体实现,然后他们会在适当的时候,自动被调用!
例如AsyncTask,执行玩doInBackground()后会执行处理结果的postResult()方法,但我们并没有设置过他们的执行顺序。
以前只知道他们的运行原理,但不知道具体的实现方法,细想起来,这是一个相当不错的代码设计,所以决定研究一下。
因为一开始是通过实现方法来具体实现那些需要被执行的方法的,所以以为实现的方式是接口,
思索很久,依然没想到接口里面如何设置方法的运行顺序,搜索发现没有相关的结果,只好去看下AsyncTask的源码,希望从源码中得到答案!
而源码相当简洁有力,直接给出了我想要的答案:实现方法被调用的顺序控制,不是通过接口来实现的,而是通过抽象类!
而具体控制程序方法的调用顺序的实现,就是在固定的方法里控制:例如AsyncTask的execute(具体的实现过程可以自己在IDE里面轻松查看,就不去具体剖析了)
以下是本人模仿的示例代码,用于打印一个字符串数组的所有内容:
public class interface
{
public static void main(String[] args){
String[] b = {"a","b","c","d","e","f","g","h","i","j"};
new Order(b) {
@Override
protected String onFirst(String s) {
System.out.println(s);
return null;
} @Override
protected String onNext(String s) {
System.out.println(s);
return null;
} @Override
protected void onCompleted(String s) {
System.out.println(s);
}
}.start(); } } //具体实现方法顺序调用的抽象类
abstract class Order{ private String[] a;
private int i = 0; public Order(String[] s){
this.a = s;
} //这个抽象对象通过本方法启动,而控制程序方法调用的具体过程就是从这里开始
public String[] start(){ onFirst(a[i++]); executor(); return a; } public void executor(){
//最后一个需要在完成时执行,也可以让next方法执行完后再去执行Completed方法
while(i < a.length-2 && a[i] != null){
a[i++] = onNext(a[i]);
}
//返回字符串数组的最后一个元素内容
onCompleted(a[a.length-1]);
} //下面这三个方法就是用来在新建对象时实现的方法,而我只想实现方法按照顺序调用,就简单地给出对应顺序的字符串
//如果想要实现更复杂的功能,原理相同,具体问题具体分析 protected abstract String onFirst(String s); protected abstract String onNext(String s); protected abstract void onCompleted(String s); }
JAVA设计方法思考之如何实现一个方法执行完毕后自动执行下一个方法的更多相关文章
- JavaScript一个页面中有多个audio标签,其中一个播放结束后自动播放下一个,audio连续播放
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Java主线程在子线程执行完毕后再执行
一.join() Thread中的join()方法就是同步,它使得线程之间由并行执行变为串行执行. public class MyJoinTest { public static void main( ...
- SNF快速开发平台MVC-审核流,审核完成后会给下一个审核人发邮件,下一个审核人可以不登录系统,在邮件里进行审核处理
审核流设计和使用参考以下资料: 审核流设计 http://www.cnblogs.com/spring_wang/p/4874531.html 审核流实例 http://www.cnblogs.com ...
- 解决Java线程池任务执行完毕后线程回收问题
转载请注明出处:http://www.cnblogs.com/pengineer/p/5011965.html 对于经常使用第三方框架进行web开发的程序员来说,Java线程池理所 ...
- 利用videojs自动播放下一个
利用videojs自动播放下一个 一.总结 一句话总结: 在视频放完的ended方法里面,指定video的src,然后this.play()放视频就好 vue来控制视频的链接也是蛮不错的 this.o ...
- [开发技巧]·HTML检测输入已完成自动填写下一个内容
[开发技巧]·HTML检测输入已完成自动填写下一个内容 个人网站 --> http://www.yansongsong.cn 在上一个博客中简易实现检测输入已完成,我们实现了检测输入已完成,现在 ...
- 解决批处理命令执行完毕后自动关闭cmd窗口方法
问题描述: 日常开发工作中,为了节省多余操作导致浪费时间,我们经常会自己建一些批处理脚本文件(xx.bat),文件中包含我们需要执行的命令,有时候我们希望执行完毕后看一下执行的结果,但是窗口执行完毕后 ...
- windows 10 删除库后自动恢复的解决方法
目录 什么是windows 库? 手动删除不行吗? 如何正确的"删除"? title: windows 10 删除库后自动恢复的解决方法 date: 2019-06-09 15:4 ...
- 用一个bat文件调用另外两个bat文件,当1.bat执行完后再执行2.bat
用一个bat文件调用另外两个bat文件,当1.bat执行完后再执行2.bat 摘自:https://zhidao.baidu.com/question/492732911.html @echo off ...
随机推荐
- BF匹配器
对于BF匹配器,首先我们得用cv2.BFMatcher()创建BF匹配器对象.它取两个可选参数,第一个是normType.它指定要使用的距离量度.默认是cv2.NORM_L2.对于SIFT,SURF很 ...
- vue-cil 服务端预渲染 prerender-spa-plugin
众所周知单页面应用不利于SEO,为了解决这个问题网上所给出的2个解决方案1.SSH服务器端渲染2.预渲染由于页面较少,且预渲染相对于SSH比较简单,于是选择预渲染页面,预渲染可以极大的提高网页访问速度 ...
- c# 获取 com 引用真实组件地址
1.根据guid获取 var clsid = new Guid("63EA2B90-C5A8-46F4-8A6E-2F2436C80003").ToString("B&q ...
- Golang之接口
- SoapUI简介及下载地址
SoapUI是一个开源测试工具,通过soap/http来检查.调用.实现Web Service的功能/负载/符合性测试.该工具既可作为一个单独的测试软件使用,也可利用插件集成到Eclipse,mave ...
- 用于模拟百度分享的errno错误代码
0:成功;-1:由于您分享了违反相关法律法规的文件,分享功能已被禁用,之前分享出去的文件不受影响.;-2:用户不存在;请刷新页面后重试;-3:文件不存在;请刷新页面后重试;-4:登录信息有误,请重新登 ...
- java http 请求的工具类
/*** Eclipse Class Decompiler plugin, copyright (c) 2016 Chen Chao (cnfree2000@hotmail.com) ***/pack ...
- TableVie优化方法和优化机制
1,UITableview的优化方法(缓存高度,异步绘制,减少层级,hide,避免离屏渲染) (1)缓存高度:当我们创建frame模型的时候,计算出来cell的高度的时候,我们可以将cell的高度缓存 ...
- C++ 64位操作系统调用 RegOpenKey() 读取注册表,返回 2, ERROR_FILE_NOT_FOUND
环境:64位操作系统, VS2017 首先在命令行执行 REG ADD HKLM\Software\seastarsun /v serial /t REG_SZ /d 58ae4cb077a4e1 在 ...
- linux setup的安装
setup作为一个l图形化的界面能够让我们更方便的去操作linux系统,而不需要记各种各样的配置文件的名称. 但是我们安装的最初的setup只有验证配置一个功能,我们还要安装完其他的功能才能使用其他的 ...