Event Handler Implementation within Activity Class

Event Handler Implementation within Activity Class – जैसाकि हम जानते हैं कि Java में Event Handling को Implement करने के लिए हमें मूलत: तीन चीजों की जरूरत होती है:

  • Event Source जो कि Event Fire करता है,
  • Event Listener जो कि Event को Listen करके Notify होता है और
  • Event Hander Method जो कि Event Listener के Notify होने के Response में Callback होता है।

अभी तक हमने जितने भी Examples देखे, उन सभी में हमने Fired Event को Response करने के लिए Event Listener Class के रूप में एक नया Named या Anonymous Class Define किया है और उसी में Appropriate Event Listener Interface के Asbtract Callback Methods को Implement किया है।

अब क्‍योंकि प्रत्‍येक Activity स्‍वयं भी एक Class ही होता है, इसलिए यदि हम चाहें तो Current Layout के विभिन्‍न UI View Controls द्वारा Fire होने वाले Events को Handle करने के लिए सम्‍बंधित Event Listener Interface को उसके साथ Associated Activity Class में भी Implement कर सकते हैं।

उदाहरण के लिए हमारे पिछले Example को ही लें, तो Simple Calculator Example में activity_main.xml Layout File है और MainActivity.java इस Layout के साथ Associated Activity Class File है। इसलिए इस activity_main.xml Layout File पर Placed विभिन्‍न UI View Controls द्वारा Fire किए जाने वाले विभिन्‍न Events को Listen करने के लिए हम MainActivity.java File की MainActivity Class को ही Listener Class बना सकते हैं, जिसके लिए हमें केवल Appropriate Event Listener Interface को इस MainActivity Class में Implement करना होगा।

उदाहरण के लिए यदि हम अपने Simple Calculator के सभी Buttons द्वारा Fire किए जाने वाले विभिन्‍न Click Events को Handle करने के लिए MainActivity Class को ही Event Listener Class की तरह Use करना चाहें, तो हमें अपनी इस MainActivity Class में View.OnClickListener Interface को निम्‍न Statement में Highlight किए अनुसार तरीके से Implement करना होगा-

public class MainActivity extends Activity implements View.OnClickListener{

   . . .

}

अब जब हम अपनी MainActivity Class को Event Listener Class की तरह Use करने के लिए उसमें View.OnClickListener Interface को Implement करने के लिए Setup कर देते हैं, तो उसके बाद हमें इस View.OnClickListener Interface के सभी Abstract Methods को MainActivity Class में Define करना जरूरी हो जाता है।

चूंकि View.OnClickListener Interface में onClick() नाम का केवल एक ही Abstract Method है जो कि किसी Click Event के Response में Event Handler Method की तरह Callback होता है, इसलिए अब हमें MainActivity Class में इस onClick() Method को Define करना होता है और किसी Interface के विभिन्‍न Abstract Methods को Associated Class में Define करने की प्रक्रिया को ही Interface Implement करना कहते हैं।

यानी यदि हम MainActivity Class में View.OnClickListener Interface को Implement करना चाहें, तो वास्‍तव में हमें निम्‍नानुसार Highlight किए अनुसार implements Keyword के साथ Interface का नाम Specify करना पड़ता है और फिर उस Interface के विभिन्‍न Abstract Methods onClick() को Define करना पड़ता है-

public class MainActivity extends Activity implements View.OnClickListener {

    . . .

    public void onClick(View v) {
        . . .
}
}

जब हम उपरोक्‍तानुसार Highlight किए गए दोनों काम कर देते हैं यानी MainActivity Class में ही implements Keyword के साथ View.OnClickListener Interface को Specify कर देते हैं और फिर इसी MainActivity Class में View.OnClickListener Interface के इकलौते Callback Method onClick() को Define कर देते हैं, तो हम ये कह सकते हैं कि हमने View.OnClickListener Interface को MainActivity Class में Implement कर दिया और जब हम View.OnClickListener Interface को MainActivity Class में Implement कर देते हैं, तो हमारी MainActivity Class ही उसके activity_main.xml Layout के विभिन्‍न UI Controls द्वारा Fire किए जाने वाले विभिन्‍न Events को Listen करने वाला Event Listener Class बन जाता है।

फलस्‍वरूप activity_main.xml Layout पर Exist कोई भी UI Control जैसे ही कोई Click Event Fire करता है, तुरन्‍त ही ये ActivityMain Class एक Event Listener Class का Role Play करते हुए उस Fired Click Event से Notify हो जाता है और Response के रूप में onClick() Event Handler Method को Callback कर देता है।

लेकिन MainActivity Class एक Event Listener Class की तरह तभी Behave कर सकता है, जबकि activity_main.xml Layout के विभिन्‍न Event Source यानी UI View Controls MainActivity के साथ Registered हों।

इसलिए अन्तिम काम के रूप में अब हमें Event SourceEvent Listener को आपस में Bind करना होता है और इस जरूरत को पूरा करने के लिए हमें फिर से setOn…Listener() Method को निम्‍नानुसार तरीके से Use करना पड़ता है:

    findViewById(R.id.btnAdd).setOnClickListener(this);

चूंकि जब हम किसी Event Source को Event Listener के साथ Bind करना चाहते हैं, तो setOn…Listener() Method में Parameter के रूप में हमें उस Class को Specify करना होता है, जिसमें Listener Interface को Implement किया गया है।

अब हमारे Current Example में हमने Listener Interface को MainActivity Class में ही Implement कर दिया है और Event Source को Event Listener के साथ Register करने का काम भी इसी MainActivity Class के onCreate() Method में कर रहे हैं, इसलिए Java के Core Programming Concepts के अनुसार यदि हमें Current Class के ही किसी Methods में, Current Class को ही Refer करने की जरूरत  हो, तो हम this का प्रयोग कर सकते हैं और इसीलिए उपरोक्‍त Statement में हमने this Keyword का प्रयोग किया है। हालांकि यदि हम चाहें, तो this के स्‍थान पर MainActivity भी Specify कर सकते हैं, Activity Class को ही Event Listener Class की तरह भी Use कर सकते हैं।

इस Event Binding Statement को Exactly इसी प्रकार से this Keyword क प्रयोग करते हुए ही लिखना जरूरी है और हम इसके स्‍थान पर निम्‍नानुसार Highlighted तरीके से Listener Class MainActivity-

   findViewById(R.id.btnAdd).setOnClickListener(MainActivity);

या new MainActivity() के किसी Instance-

   findViewById(R.id.btnAdd).setOnClickListener(new MainActivity());

को Specify नहीं कर सकते जैसाकि Member Class या Inner Anonymous Class तरीके के अन्‍तर्गत किया था और हम ऐसा इसलिए नहीं कर सकते क्‍योंकि किसी भी Android App का MainActivity या Launcher Activity वास्‍तव में Internally Java का main() Method बनता है जो कि Android Platform के लिए किसी भी Android App का Gateway Method या Entry Point होता है और किसी भी Java Program में केवल एक ही main() Method हो सकता है।

इसीलिए जिस Android Framework में MainActivity या Launcher Activity Internally जिस Class के main() Method का हिस्‍सा बनते हैं, वह Class एक Static Class होती है, ताकि उसके Instance Create न किए जा सकें।

इसी वजह से हम उपरोक्‍त Statement की तरह this के स्‍थान पर MainActivity नहीं लिख सकते क्‍योंकि MainActivity वास्‍तव में किसी Listener Class के Reference को Hold नहीं करता बल्कि स्‍वयं ही एक Listener Class है और हम this के स्‍थान पर new MainActivity() भी नहीं लिख सकते क्‍योंकि MainActivity Internally main() Method वाली Class का हिस्‍सा बनता है जो कि एक Static Class होता है और Static Class को Instantiate नहीं किया जा सकता।

इस प्रकार से अब यदि हम हमारे Simple Calculator Example को ही इस तरीके से Specify किए गए Event Handling Mechanism के अनुसार Modify करें, तो हमारा MainActivity.java File में लिखा गया Modified Java Code निम्‍नानुसार होगा-

File Name:  MainActivity.java

package com.bccfalna.arithmetic;
 
 import android.app.Activity;
 import android.os.Bundle;
 import android.view.View;
 import android.widget.EditText;
 import android.widget.TextView;
 
 public class MainActivity extends Activity implements View.OnClickListener {
     EditText etFN;
     EditText etSN;
     TextView tvResult;
     double fn;
     double sn;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
 
         //Register Event Source with Current Activity which is as Listener Class
         findViewById(R.id.btnAdd).setOnClickListener(this);
         findViewById(R.id.btnSub).setOnClickListener(this);
         findViewById(R.id.btnMul).setOnClickListener(this);
         findViewById(R.id.btnDiv).setOnClickListener(this);
         findViewById(R.id.btnRem).setOnClickListener(this);
 
         etFN = (EditText) findViewById(R.id.etFN);
         etSN = (EditText) findViewById(R.id.etSN);
         tvResult = (TextView) findViewById(R.id.tvResult);
     }
 
     public void onClick(View btnClicked) {
 
         fn = Double.parseDouble(etFN.getText().toString());
         sn = Double.parseDouble(etSN.getText().toString());
 
         switch (btnClicked.getId()) {
             case R.id.btnAdd:
                 tvResult.setText(String.valueOf(fn + sn));
                 break;
 
             case R.id.btnSub:
                 tvResult.setText(String.valueOf(fn - sn));
                 break;
 
             case R.id.btnMul:
                 tvResult.setText(String.valueOf(fn * sn));
                 break;
 
             case R.id.btnDiv:
                 tvResult.setText(String.valueOf(fn / sn));
                 break;
 
             case R.id.btnRem:
                 tvResult.setText(String.valueOf(fn % sn));
                 break;
 
             default:
                 // Nothing to do
         }
     }
 }

और इस Modified Event Handler Mechanism वाले Android App के Execution पर भी हमें Exactly वही Output प्राप्‍त होगा, जो पहले वाले Examples में हुआ था।

हम समझ सकते हैं कि इस तरीके को Use करने पर हमें एक Extra Class Create नहीं करना पड़ता, इसलिए इस तरके को Use करने पर हमारे Android App द्वारा कम Memory Use किया जाता है और CPU को एक और Event Listener Class को Define करने तथा Event Source को Event Listener के साथ Register करने हेतु Event Listener Class का एक New Instance Create करने का काम नहीं करना पड़ता, इसलिए पहले Discuss किए गए विभिन्‍न तरीकों की तुलना में इस GUI Event Handling Mechanism को Use करने पर हमारे Android App की Performance तुलनात्‍मक रूप से थोड़ी बेहतर होती है।

हालांकि इस तरीके में हम अपनी Implement की जा रही Listener Class का Public Callback Method Implement करते हैं, जिसे Current Android App की किसी भी अन्‍य Activity में आसानी से Use किया जा सकता है जबकि Current Activity के लिए Implement किए गए Callback Methods को किसी अन्‍य Activity में Use करने का कोई मतलब ही नही होता। सा‍थ ही यदि हम MainActivity में ही उसके Layout से सम्‍बंधित विभिन्‍न Events को Handle करने के लिए ढे़र सारे Listeners को Implement कर सकते हैं और यदि हम ऐसा करते हैं तो हमारे MainActivity का Declaration काफी ज्‍यादा बड़ा हो सकता है।

Android in Hindi - BccFalna.comये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook Android in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी है, तो निश्चित रूप से ये EBook भी आपके लिए काफी उपयोगी साबित होगी।

Android in Hindi | Page: 628 | Format: PDF

BUY NOW GET DEMO REVIEWS