在平常开发中总是会涉及到回调这个词,作为一个新手,我觉得必须要好好了解下回调的机制,以及该怎么用。
想看机制的可以看看这一篇文章:http://www.2cto.com/kf/201502/377156.html
网上看到一句话,A类调用B类的某个方法b,然后B类又在某个时候返回来调用A类方法c,对于B来说,这个方法c就是回调函数。
我先举个很简单的例子,为了方便,类的名字也改为A和B:
先是接口interface的代码:
/**
* 回调接口
*
*/
public interface Callback {
public void execute();
}
然后是B类的代码,通过传递接口参数,以便A类回调
public class B {
public void Test(Callback callback) {
long oldtime = System.currentTimeMillis();
callback.execute();//进行回调
long newtime = System.currentTimeMillis();
System.out.println("the time is " + (newtime - oldtime));
}
}
最后是A类的
public class A extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
B b=new B();
b.Test(new Callback(){
@Override
public void execute() {
// TODO Auto-generated method stub
System.out.println("实现回调");
}});
}
请忽略我是用Android环境写的纯Java代码调试,A类先实例化B类对象,然后调用B类的Test方法,B类的Test方法是有参数的,即接口对象,然后B类里callback的excute方法又要回到A类里面去调用excute方法,这个excute方法就是B的回调函数。一个回调过程就是这样了。
之后我另外写了一个Android上下载图片的接口回调事件,先来惯例放张程序运行结果图
还是先写接口:
/**
* Bitmap回调接口
*
*/
public interface BitmapCallback {
public void getDownloadBitmap(Bitmap bitmap);
}
然后是B类:
/**
* 图片下载类
*
*/
public class ImageDownload {
// 传递进接口参数,这样其他类引用的时候就能调用,这个方法在运行的时候又会回调MainActivity的方法
public Bitmap getBitmap(final String path, final BitmapCallback callback) {
final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
Bitmap bitmap = (Bitmap) msg.obj;
callback.getDownloadBitmap(bitmap);
}
};
// 图片下载进程
new Thread() {
public void run() {
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpPost = new HttpGet(path);
HttpResponse response = null;
try {
response = httpClient.execute(httpPost);
if (response.getStatusLine().getStatusCode() == 200) {
byte[] datas = EntityUtils.toByteArray(response
.getEntity());
Bitmap bitmap = BitmapFactory.decodeByteArray(datas, 0,
datas.length);
Message message = Message.obtain();
message.obj = bitmap;
handler.sendMessage(message);
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
}.start();
return null;
}
}
MainActivity(即A类)
public class MainActivity extends Activity {
ImageView image = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
image = (ImageView) findViewById(R.id.image);
// 实例化ImageDownload类,并且传递参数调用getBitmap方法
new ImageDownload().getBitmap(
"http://2t.5068.com/uploads/allimg/150407/1-15040G45F6.jpg",
new BitmapCallback() {
@Override
public void getDownloadBitmap(Bitmap bitmap) {
// TODO Auto-generated method stub
image.setImageBitmap(bitmap);
}
});
}
总的过程也是和上个实例差不多,在MainActivity里面实例化ImageDownload对象,然后调用他的getBitmap()方法,并传递参数。然后在B类(ImageDownload)里callback.getDownloadBitmap()会回调A类里的getDownloadBitmmap()方法。一个回调下载图片的过程就成功了。对了,别忘了在AndroidManifest里面配置网络权限!