অ্যান্ড্রয়েডে কলব্যাকগুলি কীভাবে সংজ্ঞায়িত করবেন?


152

অতি সাম্প্রতিক গুগল আইও-র চলাকালীন, ক্লায়েন্ট অ্যাপ্লিকেশনগুলিকে কার্যকর করার বিষয়ে একটি উপস্থাপনা ছিল। দুর্ভাগ্যক্রমে, এটি বাস্তবায়নের কোনও উত্স কোড ছাড়া কেবলমাত্র একটি উচ্চ পর্যায়ের আলোচনা ছিল।

এই চিত্রটিতে, ফেরার পথে অন্যান্য পদ্ধতির বিভিন্ন রকম কলব্যাক রয়েছে।

গুগল আইও উপস্থাপনা স্লাইড

আমি এই পদ্ধতিগুলি কীভাবে ঘোষণা করব?

আমি কলব্যাকের ধারণাটি বুঝি - একটি নির্দিষ্ট সংঘটিত হওয়ার পরে কল করা কোডের একটি অংশ, তবে কীভাবে এটি প্রয়োগ করা যায় তা আমি জানি না। আমি এখনও অবধি কলব্যাকগুলি প্রয়োগ করেছি বিভিন্ন পদ্ধতি (উদাহরণস্বরূপঅ্যাক্টিভিটিস রেজাল্ট) ওভাররাইড করে চলেছে।

আমি মনে করি আমার কাছে ডিজাইনের ধরণ সম্পর্কে প্রাথমিক ধারণা রয়েছে তবে কীভাবে ফিরে আসার পথটি পরিচালনা করতে হবে সে সম্পর্কে আমি তত্পর হয়ে পড়ি।


3
ঠিক আপনার যা প্রয়োজন আমি একই জিনিসটির সন্ধান করছিলাম এবং এটি পেরিয়ে এসেছি: javaworld.com/javaworld/javatips/jw-javatip10.html
সিড

উত্তর:


218

অনেক ক্ষেত্রে, আপনার একটি ইন্টারফেস রয়েছে এবং এটি কার্যকর করে এমন কোনও বস্তুটি পাস করে। উদাহরণস্বরূপ ডায়ালগগুলিতে অনক্লিকলিস্টার রয়েছে।

ঠিক একটি এলোমেলো উদাহরণ হিসাবে:

// The callback interface
interface MyCallback {
    void callbackCall();
}

// The class that takes the callback
class Worker {
   MyCallback callback;

   void onEvent() {
      callback.callbackCall();
   }
}

// Option 1:

class Callback implements MyCallback {
   void callbackCall() {
      // callback code goes here
   }
}

worker.callback = new Callback();

// Option 2:

worker.callback = new MyCallback() {

   void callbackCall() {
      // callback code goes here
   }
};

আমি সম্ভবত 2 বিকল্পটি বাক্য গঠনটি বিশৃঙ্খলা করে ফেলেছি early এটা তাড়াতাড়ি।


5
এই কৌশলটির উপর
দৃ g়তা

আমি একটি নতুন ক্রিয়াকলাপে মাই ক্যালব্যাক ইন্টারফেসটি "প্রয়োগ" করার চেষ্টা করি যা সফল নয় এবং সিস্টেমটি আমাকে এর উত্সের পথটি সম্পাদনা করার জন্য প্রয়োজন। তাহলে আমি কীভাবে একটি পুরানো ক্রিয়াকলাপ থেকে নতুন ক্রিয়াকলাপে "কলব্যাক" চালাব?
এন্টোইন মিউরিয়ান

3
এটি বলে যে শ্রমিক শ্রেণিতে কলব্যাক ভেরিয়েবলটি আমার পক্ষে বাতিল
iyonatan

কেউ কি কোটলিনকে সমমান দিতে পারে?
টুনিস

52

আমার দৃষ্টিতে যখন কিছু ঘটে তখন আমি এমন একটি ইভেন্ট ছুঁড়ে ফেলি যা আমার ক্রিয়াকলাপটি শুনছে:

// ডিসক্লার্ড ইন (কাস্টম) দেখুন

    private OnScoreSavedListener onScoreSavedListener;
    public interface OnScoreSavedListener {
        public void onScoreSaved();
    }
    // ALLOWS YOU TO SET LISTENER && INVOKE THE OVERIDING METHOD 
    // FROM WITHIN ACTIVITY
    public void setOnScoreSavedListener(OnScoreSavedListener listener) {
        onScoreSavedListener = listener;
    }

// কার্যকলাপে ঘোষিত D

    MyCustomView slider = (MyCustomView) view.findViewById(R.id.slider)
    slider.setOnScoreSavedListener(new OnScoreSavedListener() {
        @Override
        public void onScoreSaved() {
            Log.v("","EVENT FIRED");
        }
    });

আপনি যোগাযোগ সম্পর্কে আরো টুকরা মধ্যে (callbacks) জানতে চান এখানে দেখুন: http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity


1
এই # কম্যুনিকেটিং উইথঅ্যাক্টিভিটি টিউটোরিয়ালটি দুর্দান্ত ছিল। শেষ পর্যন্ত বেশ কয়েকটি পরীক্ষার পরে কীভাবে কলব্যাকগুলি ব্যবহার করবেন তা বুঝেছি।
মাইসেস জিমনেজ

দুর্দান্ত উত্তর। ধন্যবাদ!
আইওনাটান

সহজ এবং বুঝতে সহজ। ধন্যবাদ!
গ্লেন জে শোওয়ারাক

38

একটি নতুন ইন্টারফেস সংজ্ঞায়িত করার কোন প্রয়োজন নেই যখন আপনি কোনো বিদ্যমান ব্যবহার করতে পারেন: android.os.Handler.Callback। কলব্যাক টাইপের একটি অবজেক্ট পাস করুন, এবং কলব্যাকের ডাক দিন handleMessage(Message msg)


কিন্তু কিভাবে এটা করবেন?
মাজুরজিরথন

26

ইন্টারফেস ব্যবহার করে কলব্যাক পদ্ধতি বাস্তবায়নের উদাহরণ।

ইন্টারফেস নির্ধারণ, NewInterface.java

প্যাকেজ জাভা অ্যাপ্লিকেশন 1;

public interface NewInterface {
    void callback();
}

নতুন ক্লাস, নিউক্লাস.জভা তৈরি করুন । এটি মূল শ্রেণিতে কলব্যাক পদ্ধতি কল করবে।

package javaapplication1;

public class NewClass {

    private NewInterface mainClass;

    public NewClass(NewInterface mClass){
        mainClass = mClass;
    }

    public void calledFromMain(){
        //Do somthing...

        //call back main
        mainClass.callback();
    }
}

ইন্টারফেস নিউইন্টারফেস - কলব্যাক () পদ্ধতিটি বাস্তবায়নের জন্য প্রধান শ্রেণীর জাভা অ্যাপ্লিকেশন 1. জাভা। এটি নিউক্লাস অবজেক্ট তৈরি এবং কল করবে। তারপরে নিউক্লাস অবজেক্ট তার কলব্যাক () পদ্ধতির পরিবর্তে কলব্যাক করবে।

package javaapplication1;
public class JavaApplication1 implements NewInterface{

    NewClass newClass;

    public static void main(String[] args) {

        System.out.println("test...");

        JavaApplication1 myApplication = new JavaApplication1();
        myApplication.doSomething();

    }

    private void doSomething(){
        newClass = new NewClass(this);
        newClass.calledFromMain();
    }

    @Override
    public void callback() {
        System.out.println("callback");
    }

}

1
এখনও অবধি আমরা কলব্যাকের জন্য ইন্টারফেসগুলি ব্যবহার করছিলাম তবে এখন স্কোয়ারটি ইভেন্ট-বাস অটো হিসাবে একটি লিব বিকাশ করেছে really এটি সত্যই দ্রুত এবং সহায়ক।
অমল পাতিল

20

ড্রাগনের উত্তরে কিছুটা স্পষ্ট করতে (যেহেতু কী করতে হবে তা বুঝতে আমার কিছুটা সময় লেগেছে Handler.Callback):

Handlerবর্তমান বা অন্য থ্রেডে পেরিয়ে কলব্যাকগুলি কার্যকর করতে ব্যবহার করা যেতে পারে Messages Messageঝুলিতে তথ্য কলব্যাক থেকে ব্যবহার করা হয়। একটি Handler.Callbackপ্রস্ততকর্তার পাশ করা যাবে Handlerঅর্ডার সরাসরি হ্যান্ডলার ব্যাপ্ত এড়ানোর জন্য। সুতরাং, বর্তমান থ্রেড থেকে কলব্যাকের মাধ্যমে কিছু কোড কার্যকর করতে:

Message message = new Message();
<set data to be passed to callback - eg message.obj, message.arg1 etc - here>

Callback callback = new Callback() {
    public boolean handleMessage(Message msg) {
        <code to be executed during callback>
    }
};

Handler handler = new Handler(callback);
handler.sendMessage(message);

সম্পাদনা: ঠিক বুঝতে পেরেছি একই ফলাফল পাওয়ার একটি আরও ভাল উপায় আছে (কলব্যাকটি কার্যকর করতে গেলে মাইনাস নিয়ন্ত্রণ):

post(new Runnable() {
    @Override
    public void run() {
        <code to be executed during callback>
    }
});

1
আপনার চলমান পোস্ট হ্যান্ডেলমেসেস পদ্ধতির ভিতরে আছে?
ইগোরগানাপলস্কি

সেরা উত্তরের জন্য +1। আমি Callbackসংস্করণ ভাল কারণ আপনার অগত্যা প্রয়োজনীয় ডেটাতে অ্যাক্সেস থাকতে পারে Runnable.run()সময়ে আপনি এটি গঠন করা
কারবি

দ্রষ্টব্য: "বার্তা নির্মাতা জনসাধারণের কাছে, এর মধ্যে একটির পাওয়ার সেরা উপায়টি ম্যাসেজ.ওবিন্ট () বা হ্যান্ডেলআরবটেনমেজেজ () পদ্ধতিগুলির মধ্যে একটি, যা তাদের পুনর্ব্যবহৃত বস্তুর পুল থেকে টেনে তুলবে।" - এখান থেকে
jk7

10

আপনি LocalBroadcastএই উদ্দেশ্যে ব্যবহার করতে পারেন । এখানে একটি দ্রুত কুইড

একটি সম্প্রচার রিসিভার তৈরি করুন:

   LocalBroadcastManager.getInstance(this).registerReceiver(
            mMessageReceiver, new IntentFilter("speedExceeded"));

private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        Double currentSpeed = intent.getDoubleExtra("currentSpeed", 20);
        Double currentLatitude = intent.getDoubleExtra("latitude", 0);
        Double currentLongitude = intent.getDoubleExtra("longitude", 0);
        //  ... react to local broadcast message
    }

এভাবেই আপনি এটি ট্রিগার করতে পারেন

Intent intent = new Intent("speedExceeded");
intent.putExtra("currentSpeed", currentSpeed);
intent.putExtra("latitude", latitude);
intent.putExtra("longitude", longitude);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);

অনপেজ এ রিসিভার নিবন্ধন করুন:

protected void onPause() {
  super.onPause();
  LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.