Android的介面回撥的Demo例項
阿新 • • 發佈:2019-02-20
在平常開發中總是會涉及到回撥這個詞,作為一個新手,我覺得必須要好好了解下回調的機制,以及該怎麼用。
想看機制的可以看看這一篇文章: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裡面配置網路許可權!