コールバックメソッドとは?
状態:いつかリトライするかも?
閲覧数:5,143
投稿日:2013-05-18
更新日:2013-05-19
・「メソッドを呼び出した際」に実行されるよう、予め指定しておくメソッド
・「メソッドを呼び出す際」引数としてコールバックメソッドへの参照情報を渡すことで、呼び出し先から任意のコールバックメソッドを実行させ、コールバックメソッドに実行制御を移すことができる
・電話を相手に一度かけて電話番号のみを伝え、いったん電話を切って折り返し相手からかけなおしてもらう様子(これを「コールバック」という)に似ているためこの名前がついた
・コールバックメソッドは、呼び出し先で何らかのイベントが発生した場合の処理を指定する目的で使われることが多い
・コールバックメソッドを利用すると、イベントの発生を検知するための処理と、そのイベントが起こった時に実行すべき個々の処理を分離して記述することができる
・Javaのようなオブジェクト指向言語においては、関数ポインタのしくみが無く、コールバックメソッドと同様の処理を行うためのオブジェクトを用いて同様のしくみを実現している。Javaではコールバックメソッドに対応するオブジェクトを「Listener」(リスナー)と呼んでいる
※リスナーに関しては、文脈に応じて「インターフェイス」or 「実装クラス」何れを指すか、判断する必要がある
・「メソッドを呼び出す際」引数としてコールバックメソッドへの参照情報を渡すことで、呼び出し先から任意のコールバックメソッドを実行させ、コールバックメソッドに実行制御を移すことができる
・電話を相手に一度かけて電話番号のみを伝え、いったん電話を切って折り返し相手からかけなおしてもらう様子(これを「コールバック」という)に似ているためこの名前がついた
・コールバックメソッドは、呼び出し先で何らかのイベントが発生した場合の処理を指定する目的で使われることが多い
・コールバックメソッドを利用すると、イベントの発生を検知するための処理と、そのイベントが起こった時に実行すべき個々の処理を分離して記述することができる
・Javaのようなオブジェクト指向言語においては、関数ポインタのしくみが無く、コールバックメソッドと同様の処理を行うためのオブジェクトを用いて同様のしくみを実現している。Javaではコールバックメソッドに対応するオブジェクトを「Listener」(リスナー)と呼んでいる
※リスナーに関しては、文脈に応じて「インターフェイス」or 「実装クラス」何れを指すか、判断する必要がある
「メソッドを呼び出す際」引数としてコールバックメソッドへの参照情報を渡す
概要
それぞれのインターフェイスに対しコールバックメソッドはひとつだけ
・イベントリスナのコールバックメソッドは何故一つ?
コールバックメソッドのひとつを宣言しイベントをハンドリングする方法は大きく2種類
・アクティビティにインターフェイスをネストさせ実装
・匿名クラスとして定義
View.set...Listener() メソッドにインターフェイスの実装を渡す
・それぞれの View.set...Listener() メソッドにインターフェイスの実装を渡す (例えば、 setOnClickListener()
を呼び出しそれに OnClickListenerの実装を渡す)
例1
・リスナクラスを定義
// クリックリスナーの登録
bt.setOnClickListener(new ShowClickButton());
}
// ボタンクリック時に呼ばれるメソッド
private class ShowClickButton implements OnClickListener {
public void onClick(View view) {
TextView tview = (TextView)findViewById(R.id.textView1);
tview.setText("ボタンが押されましたよ");
}
};
例2
・既存のクラスにインターフェイスを実装
「OnClickListener 」引数に this を指定
・ここでのthisは「OnClickListenerインターフェイスを実装したユーザ作成クラス」の意味
public class HelloAndroid4 extends Activity implements OnClickListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// ボタンオブジェクトの取得
Button bt = (Button)findViewById(R.id.button1);
// クリックリスナーの登録
bt.setOnClickListener(this);
}
例3
・匿名クラス1
// クリックリスナーの登録
bt.setOnClickListener(new OnClickListener() {
public void onClick(View view) {
TextView tview = (TextView)findViewById(R.id.textView1);
tview.setText("ボタンが押されました");
}
});
例4
・匿名クラス2
// クリックリスナーの登録
bt.setOnClickListener(showClickButton);
}
private final OnClickListener showClickButton = new OnClickListener() {
public void onClick(View v) {
TextView tview = (TextView)findViewById(R.id.textView1);
tview.setText("ボタンが押されました");
}
};
コールバックメソッド例
onClick()
・View.OnClickListenerインターフェイスの抽象メソッド
・ユーザがアイテムをタッチされたとき、(タッチモードのとき) または、ナビゲーションキーまたはトラックボールでアイテムにフォーカスしてから適正に"enter" キーを押すかトラックボールを押した場合に呼び出される
onLongClick()
・View.OnLongClickListenerインターフェイスの抽象メソッド
・ ユーザがアイテムをタッチされたままの状態にしたとき、(タッチモードのとき) または、ナビゲーションキーまたはトラックボールでアイテムにフォーカスしてから適正に"enter" キーを押したままの状態かトラックボールを押したままにした (1秒間) 場合に呼び出される
onFocusChange()
・View.OnFocusChangeListenerインターフェイスの抽象メソッド
・ ユーザがナビゲーションキーまたはトラックボールでアイテムにナビゲートした、またはアイテムから離れた場合に呼び出される
onKey()
・View.OnKeyListenerインターフェイスの抽象メソッド
・ ユーザがアイテムにフォーカスし、デバイスのキーを押した、または離した場合に呼び出されまる
onTouch()
View.OnTouchListenerインターフェイスの抽象メソッド
・ ユーザがスクリーン上 (のアイテムの境界内で)で、押す、離す、またはその他の動作を行ったことでタッチイベントとみなされるアクションを起こした場合に呼び出される
onCreateContextMenu()
View.OnCreateContextMenuListenerインターフェイスの抽象メソッド
・ コンテキストメニューが作成された ("ロングクリック"の状態が維持された結果として) ときに呼び出される
・コンテキストメニューについての詳しい情報はこちら