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

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

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

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


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

显然,通过接口你可以在回调方法里做你想做的事,而不用接口的话,你可能会将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<Void, Void, Boolean>{UiExecute execute;BackgroundInit init;//构造方法传入这两个接口的实现类public XpAsynncTask(UiExecute execute,BackgroundInit init){this.execute=execute;this.init=init;}@Overrideprotected Boolean doInBackground(Void... params) {// TODO Auto-generated method stubboolean result=false;result=init.doinbackground();//接口的抽象方法,具体实现在调用这个类的构造方法前实现return result;}@Overrideprotected void onPostExecute(Boolean result) {// TODO Auto-generated method stubsuper.onPostExecute(result);if (result) {execute.onsucess();//接口的抽象方法,具体实现在调用这个类的构造方法前实现}else {execute.onfailed();//接口的抽象方法,具体实现在调用这个类的构造方法前实现}}}

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

<pre name="code" class="html">XpAsynncTask task=new XpAsynncTask(new UiExecute() {@Overridepublic void onsucess() {// TODO Auto-generated method stub}@Overridepublic void onfailed() {// TODO Auto-generated method stub}}, new BackgroundInit() {@Overridepublic boolean doinbackground() {// TODO Auto-generated method stubreturn false;}});task.execute();


  

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

public void writeDataByYouself(UiExecute execute,final ProcessData processData) {//processData,再次增加的一个接口,这个接口只让调用者添加数据,发送的事情,我来做// TODO Auto-generated method stubXpAsynncTask task=new XpAsynncTask(execute,new BackgroundInit() {//BackgroundInit接口我不暴露给调用者去实现了@Overridepublic boolean doinbackground() {// TODO Auto-generated method stubList<byte[]> list=processData.processDataBeforeSend();//processData,再次增加的一个接口,这个接口只让调用者添加数据,发送的事情,我来做if (list!=null) {for (int i = 0; i < list.size(); i++) {mMsg=xPrinterDev.Write(list.get(i));}if (mMsg.GetErrorCode().equals(ErrorCode.WriteDataSuccess)) {return true;}}return false;}});//task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);task.execute();}


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

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

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
















更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. android中关闭所有activity方法
  3. Android面试题(部分2)
  4. android中导入开源项目,常出现的导致编译错误的解决方法
  5. 安卓开发学习之014 Button应用详解(样式、背景、按钮单击、长按、
  6. 解决IE apk变成zip:Android(安卓)手机应用程序文件下载服务器Ngin
  7. 微信小程序菜单实现
  8. Android:异步处理之AsyncTask的应用(二)
  9. Android——操作数据库-增删改查-案例《商品展示》

随机推荐

  1. sql server数据库高可用日志传送的方法
  2. SqlServer 获取字符串中小写字母的sql语
  3. Sql Server 如何去掉内容里面的Html标签
  4. SQL Server 远程更新目标表数据的存储过
  5. 使用sqlplus创建DDL和DML操作方法
  6. 详解SqlServer数据库中Substring函数的用
  7. SQL Server Management Studio(SSMS)复制数
  8. Windows下SQL Serever 2012彻底卸载删除
  9. SQL Server2012数据库备份和还原的教程
  10. 一条SQL语句查询多个数据库