Android 介面回調執行個體
Android介面回調方法處處涉及到,比如常用的Button點擊事件就是一個介面回調,可見掌握熟練使用介面回調方法的重要性。
介面回調的簡單解釋就是:比如我這個類實現了一個介面裡的方法doSomething,然後註冊到你這裡,然後我就去做別的事情去了, 你在某個觸發的時機回頭來調用我doSomething的方法。
介面回調一般有兩種寫法,實現形式不一樣,但是具體的內部的實現邏輯是一樣。
直接給出代碼:
方法一:
package com.callbackdemo;import android.graphics.Bitmap;/** * 介面 * * @author zhongyao */public interface ImageStateInterface {void onImageStart();void onImageSuccess(Bitmap bitmap);void onImageFailed();void OnEnd();}
package com.callbackdemo;import android.annotation.SuppressLint;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.drawable.BitmapDrawable;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast;/** * Android 介面回調執行個體 * * @author zhongyao */public class MainActivity extends Activity implements ImageStateInterface {private Button button;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);/** * 執行個體化控制項 */onLincoln();}private void onLincoln() {button = (Button) findViewById(R.id.button1);button.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {DownloadImageUtil downloadImageUtil = new DownloadImageUtil();// 調用StartDownLoad方法,目的是將MainActivity註冊到介面那裡,使介面知道,需要調用的是哪個類中的實現該介面的方法。downloadImageUtil.StartDownLoad(MainActivity.this,getApplicationContext());}});}@Overridepublic void onImageStart() {Log.d("lincoln", "onImageStart");button.setText("onImageStart");}@Overridepublic void onImageSuccess(final Bitmap bitmap) {Log.d("lincoln", "onImageSuccess");runOnUiThread(new Runnable() {@SuppressLint("NewApi")@Overridepublic void run() {button.setText("onImageSuccess");button.setBackground(new BitmapDrawable(bitmap));}});}@Overridepublic void onImageFailed() {}@Overridepublic void OnEnd() {Toast.makeText(MainActivity.this, "哈哈!!", 0).show();}}
package com.callbackdemo;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;/** * 在該類中調用MainActivity已實現的介面中的方法。 * @author zhongyao */public class DownloadImageUtil {public void StartDownLoad(final ImageStateInterface imageStateInterface,final Context context) {//該imageStateInterface使其得知,是從哪裡註冊過來的,然後根據其來源調用其實現的介面方法。//如下,此時調用的就是MainActivity.this中實現的onImageStart方法。imageStateInterface.onImageStart();new Thread(new Runnable() {@Overridepublic void run() {try {new Thread().sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon);imageStateInterface.onImageSuccess(bitmap);}}).start();imageStateInterface.OnEnd();}}
方法二:實現原理一樣,只是實現形式不一樣而已。
package com.callbackdemo;import android.graphics.Bitmap;/** * 介面 * * @author zhongyao */public interface ImageStateInterface {void onImageStart();void onImageSuccess(Bitmap bitmap);void onImageFailed();void OnEnd();}
package com.callbackdemo;import android.annotation.SuppressLint;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.drawable.BitmapDrawable;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast;/** * Android 介面回調執行個體 * * @author zhongyao */public class MainActivity extends Activity{private Button button;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);/** * 執行個體化控制項 */onLincoln();}private void onLincoln() {button = (Button) findViewById(R.id.button1);button.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {DownloadImageUtil.StartDownLoad(imageInterface,MainActivity.this);}});}ImageStateInterface imageInterface = new ImageStateInterface() {@Overridepublic void onImageStart() {Log.d("lincoln", "onImageStart");button.setText("onImageStart");}@Overridepublic void onImageSuccess(final Bitmap bitmap) {Log.d("lincoln", "onImageSuccess");runOnUiThread(new Runnable() {@SuppressLint("NewApi")@Overridepublic void run() {button.setText("onImageSuccess");button.setBackground(new BitmapDrawable(bitmap));}});}@Overridepublic void onImageFailed() {}@Overridepublic void OnEnd() {Toast.makeText(MainActivity.this, "哈哈!!", 0).show();}};}
package com.callbackdemo;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;/** * 在該類中調用MainActivity已實現的介面中的方法。 * @author zhongyao */public class DownloadImageUtil {public static void StartDownLoad(final ImageStateInterface imageInterface,final Context context) {imageInterface.onImageStart();new Thread(new Runnable() {@Overridepublic void run() {try {new Thread().sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon);imageInterface.onImageSuccess(bitmap);}}).start();imageInterface.OnEnd();}}
效果: