热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

接口的使用,以及在异步任务中的使用

相信很多java和Android初学者,都对接口的定义有一些了解,但是如何使用它,利用它的特性来更好的实现自己想要的功能,却不甚了解。之前,我写代码也是没怎么用过接口,看到Android里,

相信很多java和Android初学者,都对接口的定义有一些了解,但是如何使用它,利用它的特性来更好的实现自己想要的功能,却不甚了解。之前,我写代码也是没怎么用过接口,看到Android里,如监听方法里实现接口的写法,如:setOnClickListener(new OnClickListener(),或者网络请求的回调方法等等。都用到接口,实现了回调方法。这样写的好处,试过了就知道了。

好处一:在你想要实现某种功能(却还不明确具体需求)的地方,你只需要在哪里调用 接口的抽象方法,而具体的实现,你却可以在你喜欢的其他地方实现。

例如:监听方法的onclick回调方法,它里面的代码执行在点击事件完成后。仿写一个:

//接口的定义
public interface Callbackinterface {
	void dosomethinFailed();
	void dosomethingSuceess();
}
//接口的抽象方法调用的地方,这个例子里在Bijiao类里的方法里通过判断调用
public class Bijiao{
	
	public  void comprate(int a,int b,Callbackinterface callbackinterface){
		if (a>b) {
			callbackinterface.dosomethingSuceess();
		}else {
			callbackinterface.dosomethinFailed();
		}
	}
}


 
 
//最后,在java的mian方法里,调用Bijiao类的方法,并传入一个实现的接口,就可以了,重写的方法调用在上面的判断里,并执行
public class Test {
	public static void main(String[] args) {
		Bijiao bijiao=new Bijiao();
		bijiao.comprate(5, 4, new Callbackinterface() {
			
			@Override
			public void dosomethingSuceess() {
				// TODO Auto-generated method stub
				//dosomething you want
			}
			
			@Override
			public void dosomethinFailed() {
				// TODO Auto-generated method stub
				//dosomething you want
			}
		});
		
	}


	

}

 
 

显然,通过接口你可以在回调方法里做你想做的事,而不用接口的话,你可能会将Bijiao类的的方法的代码写死,不便于复用和修改。面向接口编程,也是一种解耦的不错选择。接下来,我们来做一个稍微复杂点的案例。我们的项目里,总是会遇到很多异步处理的需求,多线程来处理这些任务。通常,我们会用thread和handler,或者异步任务来做这些事情。异步任务和handler就挑异步任务来说下吧,因为异步任务本身也就是将thread和handler处理封装了而已,而且,也用的是接口。在异步任务AsyncTask里,有两个重要的重写方法doInBackground和onPostExecute,分别就是工作线程和ui线程的操作了。

接下来,我想将异步任务进一步通过实现一个接口,来使得这个异步任务类跟适合复用。

//先定义一个接口,这个接口用来实现工作线程的执行代码
public interface BackgroundInit {
	boolean doinbackground();
	
}
//在定义一个接口,执行UI线程要执行的代码
public interface UiExecute {
	void onsucess();
	void onfailed();
}

//定义一个继承AsyncTask的类
public class XpAsynncTask extends AsyncTask{
	UiExecute execute;
	BackgroundInit init;
	//构造方法传入这两个接口的实现类
	public XpAsynncTask(UiExecute execute,BackgroundInit init){
		this.execute=execute;
		this.init=init;
	}
	@Override
	protected Boolean doInBackground(Void... params) {
		// TODO Auto-generated method stub
		boolean result=false;
		result=init.doinbackground();//接口的抽象方法,具体实现在调用这个类的构造方法前实现
		return result;
	}

	@Override
	protected void onPostExecute(Boolean result) {
		// TODO Auto-generated method stub
		super.onPostExecute(result);
		if (result) {
			execute.onsucess();//接口的抽象方法,具体实现在调用这个类的构造方法前实现
		}else {
			execute.onfailed();//接口的抽象方法,具体实现在调用这个类的构造方法前实现
		}
	}
	

}

最后,在你要调用这个异步任务处理的时候,你只需要如下,就不用每次都重写一个异步任务去修改doInBackground和onPostExecute里的代码了。

XpAsynncTask task=new XpAsynncTask(new UiExecute() {
				
				@Override
				public void onsucess() {
					// TODO Auto-generated method stub
					
				}
				
				@Override
				public void onfailed() {
					// TODO Auto-generated method stub
					
				}
			}, new BackgroundInit() {
				
				@Override
				public boolean doinbackground() {
					// TODO Auto-generated method stub
					return false;
				}
			});
			task.execute();


 
 

同样的,你还可以继续在这个代码块的某个地方再实现个接口,暴露给调用者实现的接口就当做方法的参数即可。就像我上面的写法,就是给异步任务嵌套了一层接口而已。

public void writeDataByYouself(UiExecute execute,
				final ProcessData processData) {//processData,再次增加的一个接口,这个接口只让调用者添加数据,发送的事情,我来做
			// TODO Auto-generated method stub
			XpAsynncTask task=new XpAsynncTask(execute,new BackgroundInit() {//BackgroundInit接口我不暴露给调用者去实现了

				@Override
				public boolean doinbackground() {
					// TODO Auto-generated method stub
					
					List list=processData.processDataBeforeSend();//processData,再次增加的一个接口,这个接口只让调用者添加数据,发送的事情,我来做
					if (list!=null) {
						for (int i = 0; i  
 

 
 恩,看了这几个例子,你是不是发现,接口其实没什么,就是在另外一个方法里,参数是这个接口的实现类,然后在方法体的某一个地方调用它的抽象方法吧了,说的简单点,就是把一个代码块换到了你想执行的地方去执行,而那个执行的地方用接口的抽象方法做了标记。没错,就是这么简单。 
 

还有一点好处就是,如果你的异步任务的子类,不是写着Activity或者fragment里的话,又想进行一些ui操作,怎么办,难道把要进行ui操作的控件和对象全部通过构造方法传参过去?还是是个控件对象你就定义为静态的?这样肯定不怎么好吧。那就用接口吧,在活动或者碎片里,实现接口,就很容易解决这些问题。而这个异步任务的子类也将具有非常高的复用性。代码结构也简洁易懂。

这一篇就说那么多了,下一篇,讲下接口,service,异步任务的结合使用情况。不忙的话。

















推荐阅读
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 最近学习反射机制的时候Properties.load(读取本地文件流的时候怎么也找不到加载文件后面发现IDEA的默认根目录是在它的Project工程下IDEA的文件目录和Ec ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
author-avatar
菜鸟玩家
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有