1. 程式人生 > >Android的介面回撥的Demo例項

Android的介面回撥的Demo例項

在平常開發中總是會涉及到回撥這個詞,作為一個新手,我覺得必須要好好了解下回調的機制,以及該怎麼用。

想看機制的可以看看這一篇文章: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裡面配置網路許可權!