以前在学Java基础课的时候就听说了Java的回调机制,当时学的是一知半解,学完就忘记了,也一直没有用到过。后来听说这块的内容还是蛮重要的,就又去复习了几遍,但是我一直都不知道这个机制该怎么时候去使用它。最近在写项目的时候,第一次用到了这个东西,感觉才算是真正理解了这个机制。
先讲一下项目吧,是这样的。我做了一个贴纸画板,用了网上的stickerView框架,我把在StickerView界面上面的手指触摸的监听操作Ontouch()函数写在了StickerView框架下的stickerview类中,但是后来添加了一个需求,就是在画板上面进行绘画的操作,要求有撤销和复原绘画轨迹的功能,而且撤销和复原这两个按钮要做一个判断,判断当前的画板是否有path来给你撤销或是复原。这时就出现了一个问题:我要在makefragment(一个Fragment)板块里面设置控件的不可点击,但是判断控件是否可以点击的函数只能写在stickerview类中,如何把这两个类联系起来? 我一开始想到的是在stickerview中创建makefragment,把makefragment板块传进去就可以了啊,但是有一个问题就是:stickerview在StickerView工程下,是无法导入makefragment的那个包的,所以自然是不行的,那么就只能用回调机制。
在stickerview类中写接口callback,函数体是判断撤回和复原按钮是否可用,并创建callback引用,设置set()和get()函数。在makefragment中实现接口,并实现接口中的两个方法,实现的方法调用先前在makefragment中创建好的mStickerview实例的判断是否有path可用的函数,来改变两个按钮是否可用,最后mStickerback.setCallback(this)把makefragment传入stickerview内,再在每次绘画完成或者点击回撤复原按钮后便调用callback实例的两个判断函数,就完成了。
因为没有项目的源码,所以可能是有点绕,希望自己以后再搞忘记回调机制的时候再回来看看能回想起来(应该是不会忘记了)。
还有一个案例,我以前在看郭神的第二行代码的时候,他在网络那一章,写了利用回调机制来进行网络资源的获取。案例比我这个通俗易懂多了。
在android中所有的网络请求都要写在子线程中,因为需要网络连接部分一般有很多,所以我们一般把网络连接的版块单独提出来,做成一个静态方法,每次调用的时候只需要把URL传进去,返回一个网络请求的返回数据就可以了。那么问题来了,在网络连接的方法中开子线程,每次调用这个函数的时候,会出现服务器还没来得及响应你的请求,这个函数就执行完了,取不到返回值的情况。这个时候怎么办呢?使用回调。
我们定义一个接口
public interface HttpCallback{
void onfinish(String reponse);
void onerrer(Exception e);
}
在我们需要连接网络的类中实现这个接口并实现接口方法。
class Xxx extends XXX implements HttpCallback{
@override
public void onfinish(String reponse){
//这里根据返回值写具体逻辑
}
@override
public void onerrer(Exception e){
//这里写对错误处理
}
}
然后把class Xxx的实例传到网络连接的工具函数中去就可以了,当工具函数执行完网络请求操作以后就执行HttpCallback.onfinish(String reponse)和HttpCallback.onerrer()两个个函数就可以顺利取到返回值和进行错误处理了。