يتم تعريف عمليات الاسترداد في ويكيبيديا على النحو التالي:
في برمجة الكمبيوتر ، تشير وظيفة رد الاتصال إلى إشارة إلى جزء معين من التعليمات البرمجية القابلة للتنفيذ يتم نقله إلى رمز آخر من خلال معلمات الوظيفة.
والغرض من ذلك هو السماح للرمز الأساسي بالاتصال بروتين فرعي محدد في المستوى الأعلى.
على سبيل المثال ، قد يكون الأمر أكثر وضوحًا: استخدام إعادة التعديل التحديثي لطلبات الشبكة في Android كمثال ، هذا مثال على عمليات الاسترداد غير المتزامنة.
بعد بدء طلب الشبكة ، يمكن للتطبيق متابعة أشياء أخرى. يتم الحصول على نتيجة طلب الشبكة عمومًا من خلال طريقتي Onresponse و OnFaileure. ألق نظرة على الكود في الجزء ذي الصلة:
call.enqueue (رد اتصال جديد <HistoryBean> () {Override public void onResponse (call <historybean> call ، response <historybean> respress) {historybean hb = response.body () ؛ if (hb == null) return ؛ showtext.append (hb.iserror () + ") showtext.append (rb.gettitle () + "/n") ؛تجاهل الأدوية الجيلية في رد الاتصال أعلاه. وفقًا للتعريف في ويكيبيديا ، يمكن اعتبار جميع التعليمات البرمجية في فئة داخلية مجهولة كمرجع إلى رمز قابل للتنفيذ معين يتم تمريره إلى رموز أخرى . الطريقتان onResponse و OnFaileure هما طرق رد الاتصال. الكود الأساسي هو جزء طلب الشبكة غير المتغير الذي تمت كتابته ، والروتين الفرعي المحدد بالمستوى الأعلى هو رد الاتصال. نظرًا لأن التنفيذ المحدد يتم تسليمه إلى المستخدم ، فإنه يتمتع بمرونة عالية. ما ورد أعلاه مرتبط من خلال الطريقة enqueue (رد اتصال رد الاتصال).
خطوات طريقة رد الاتصال
رد الاتصال المذكور أعلاه هو مفهوم شائع جدا. إذا وضعته في كتابة البرنامج ، يمكنك القول:
في الفئة A ، تسمى الطريقة C في الفئة B ، ثم في الفئة B ، تسمى الطريقة D في الفئة A في الاتجاه المعاكس. D هي طريقة رد الاتصال. الفئة B هي الرمز الأساسي ، والفئة A هي الرمز عالي المستوى.
لذلك من خلال التفسير أعلاه ، يمكننا استنتاج شيء ما. من أجل تمثيل عالمية الطريقة D ، نستخدم نموذج الواجهة لجعل الطريقة D تسمى طريقة واجهة. إذا أراد الفئة B الاتصال بأسلوب D في الفئة A ، فيجب على الفئة A تنفيذ هذه الواجهة. وبهذه الطريقة ، بناءً على التنفيذ ، سيكون هناك تعدد الأشكال ، مما يجعل الطريقة مرنة.
إذا أراد الفئة A استدعاء الطريقة C في الفئة B ، فيجب أن تحتوي الفئة A على إشارة إلى B ، وإلا فلن يتم استدعاؤها. وتسمى هذه الخطوة واجهة رد الاتصال التسجيل. لذا ، كيفية تنفيذ طريقة الاتصال العكسي D في الفئة A في الفئة B ، مباشرة من خلال الطريقة أعلاه C. الطريقة C في الفئة B تقبل معلمة نوع الواجهة. بعد ذلك ، في الطريقة C فقط ، تحتاج إلى استخدام معلمات نوع الواجهة هذا للاتصال بـ De في الفئة B ، والتي بدورها تستدعي طريقة D في الفئة A. تسمى هذه الخطوة استدعاء واجهة رد الاتصال.
هذا ينفذ أيضًا أنه في طريقة C من الفئة B ، يجب استدعاء طريقة D في الفئة A في العكس ، وهو رد الاتصال. مكالمات B لضبط مباشرة ، والتي يمكن اعتبارها باستخدام واجهة برمجة التطبيقات الأساسية للرمز العالي المستوى. غالبًا ما نكتب برامج مثل هذا. B يستدعي A للاتصال مرة أخرى ، وتتطلب واجهة برمجة التطبيقات الأساسية رمزًا عالي المستوى للتنفيذ.
أخيرًا ، دعونا نلخص خطوات طريقة رد الاتصال:
مثال رد الاتصال
دعنا نأخذ ابنًا يلعب الألعاب وننتظر والدته لإعداد الوجبة وإخطار ابنه بالحضور والأكل كمثال ، واتبع الخطوات المذكورة أعلاه لكتابة رد اتصال ؛
في المثال أعلاه ، من الواضح أن الابن يجب أن ينفذ واجهة رد الاتصال ويجب على الأم الاتصال بواجهة رد الاتصال. لذلك نحدد أولاً واجهة رد الاتصال ، ثم ندع ابننا ينفذ واجهة رد الاتصال هذه.
الرمز كما يلي:
رد اتصال الواجهة العامة {void eat () ؛} ابن الطبقة العامة ينفذ رد الاتصال {أمي أمي ؛ يحمل الفئة A إشارة إلى الفئة B public void setmom (أمي أمي) {this.mom = mom ؛ } Override public void eat () {system.out.println ("أنا هنا لتناول وجبة") ؛ } public void askmom () {// استدعاء طريقة مع معلمات الواجهة من خلال مرجع إلى الفئة B. system.out.println ("هل تم طهي الوجبة؟") ؛ System.out.println ("لم يتم القيام به ، أنا ألعب اللعبة") ؛ موضوع جديد (() -> mom.docook (son.This)). start () ؛ System.out.println ("لعب اللعبة ...") ؛ }}ثم نحتاج أيضًا إلى تحديد فئة الأم ، والتي تحتوي على طريقة مع معلمات الواجهة
الفئة العامة أمي {// استدعاء طريقة رد الاتصال باستخدام معلمات الواجهة في طريقة تحتوي على معلمات واجهة public void doCook (callback callback) {new thread (new runnable () {ouverride void run () {try {system.out.println ("cooking ...") ؛ E.PrintStackTrace () ؛ }}نمر باختبار فئة:
اختبار الفئة العامة {public static void main (string [] args) {mom mom = new mom () ؛ الابن = الابن الجديد () ؛ son.setmom (أمي) ؛ son.askmom () ؛ }}هذا المثال هو مثال رد اتصال نموذجي. تنفذ فئة SON طريقة رد الاتصال للواجهة. إنها تستدعي docook في فئة MOM من خلال طريقة ASKMOM لتسجيل واجهة رد الاتصال ، وهو ما يعادل استدعاء رمز الفئة B في الفئة A. في فئة MOM يدعو إلى الأمام ذهابًا وإيابًا في فئة الابن لإخبار النتائج في فئة SON.
وبهذه الطريقة ، نقوم بتنفيذ رد اتصال بسيط ومحدد.
مزيد من الاستكشاف لأمثلة رد الاتصال
دعونا نلقي نظرة على رمز فئة الابن:
ابن الطبقة العامة ينفذ رد الاتصال {أمي الأم ؛ الابن العام (أمي أمي) {this.mom = أمي ؛ } public void askmom () {system.out.println ("هل تم طهي الوجبة؟") ؛ System.out.println ("لم أفعل ذلك جيدًا ، لقد لعبت اللعبة") ؛ موضوع جديد (() -> mom.docook (son.This)). start () ؛ System.out.println ("لقد لعبت اللعبة ...") ؛ } Override public void eat () {system.out.println ("حسنًا ، أنا هنا لتناول وجبة") ؛ }}في هذه الفئة ، بالإضافة إلى إخراج بعض العبارات ، فإن الأجزاء المفيدة حقًا هي mom.docook (SON.THIS) وإعادة كتابة طريقة EAT. لذلك ، يمكننا اختصار هذا الاتصال من خلال شكل فئة داخلية مجهولة. الرمز كما يلي:
الفئة العامة callbackTest {public static void main (string [] args) {mom mom = new mom () ؛ موضوع جديد (() -> mom.docook (() -> system.out.println ("لقد تناولت وجبة ...")). start () ؛ }}قم بإلغاء فئة SON وتنفيذ طريقة EAT مباشرة من خلال فئة داخلية مجهولة الهوية بالطريقة الرئيسية. في الواقع ، فصول داخلية مجهولة الهوية هي تجسيد لعمليات الاسترجاعات.
عمليات الاستراعات غير المتزامنة وعمليات العوامل المتزامنة
رد الاتصال: طريقة مكالمات C في الفئة B ، ثم المكالمات في الفئة A من خلال الفئة A الكائنات في الطريقة C.
دعنا نتحدث عن غير المتزامن والمزامنة ، دعنا نتحدث عن مفهوم التزامن أولاً.
متزامن
يعني التزامن أنه عند استدعاء طريقة ما ، إذا لم يتم تنفيذ استدعاء الطريقة السابقة ، فلا يمكن إجراء استدعاء طريقة جديدة. بمعنى آخر ، يجب القيام بالأمور واحدة تلو الأخرى ، ويمكنك فقط القيام بالمرء التالي تلو الآخر.
غير متزامن
عدم التزامن بالنسبة للمزامنة ، لا تحتاج إلى الانتظار حتى يتم الانتهاء من استدعاء الطريقة السابقة قبل استدعاء طريقة جديدة. لذلك ، في مكالمات الطريقة غير المتزامنة ، هناك حاجة إلى طريقة لإخطار المستخدم بنتيجة استدعاء الطريقة.
تنفيذ الأساليب غير المتزامنة
الطريقة الأكثر شيوعًا لتنفيذ غير متزامن في Java هي السماح للطريقة التي تريد تنفيذها بشكل غير متزامن في موضوع جديد.
سنجد أن هناك حاجة إلى طريقة في مكالمة غير متزامنة لإخطار نتيجة استدعاء المستخدم. بناءً على ما سبق ، سنجد أن طريقة رد الاتصال مناسبة للقيام بذلك ، وإخطار المستخدم بنتيجة المكالمة من خلال طريقة رد الاتصال.
يتم الاتصال غير المتزامن في سلسلة رسائل جديدة عندما يكون طريقة المكالمات C من B.
المثال أعلاه للأم التي تخطر ابنها على العشاء هو مثال على رد اتصال غير متزامن. في موضوع جديد ، يتم استدعاء طريقة docok ويتم قبول قيمة الإرجاع أخيرًا من خلال EAT. بالطبع ، بعد استخدام تحسين LAMDBA ، يكون الجوهر هو نفسه.
رد الاتصال المتزامن يعني أن A BL Method C ليس في موضوع جديد. عند تنفيذ هذه الطريقة C ، لا يمكننا القيام بأي شيء ويمكننا الانتظار حتى يكتملها.
أمثلة على عمليات الاسترجاعات المتزامنة والاسترداد غير المتزامن
دعونا نلقي نظرة على مثال على رد اتصال متزامن في Android:
button.setonClickListener (new view.onclickListener () {Override public void onClick (view v) {log.i ("button" ، "clicked") ؛}}) ؛يقوم الزر بتسجيل وظيفة رد الاتصال من خلال SetOnClickListener ، وكما هو مكتوب أعلاه ، يمرر مرجع الواجهة في شكل فئة داخلية مجهولة. نظرًا لأن الزر يستدعي SetonClickListener دون إنشاء مؤشر ترابط جديد ، فهذا رد اتصال متزامن.
رد الاتصال غير المتزامن هو المثال الذي تحدثنا عنه في البداية:
call.enqueue (رد اتصال جديد <HistoryBean> () {Override public void onResponse (call <historybean> call ، response <historybean> respress) {historybean hb = response.body () ؛ if (hb == null) return ؛ showtext.append (hb.iserror () + ") showtext.append (rb.gettitle () + "/n") ؛طريقة enqueue هذه هي طريقة غير متزامنة لطلب بيانات الشبكة عن بُعد. عندما يتم تنفيذه داخليًا ، يتم تنفيذها من خلال موضوع جديد.
من خلال هذين المثالين ، يمكننا أن نرى أن استخدام عمليات الاسترجاعات المتزامنة وعمليات الاسترجاعات غير المتزامنة تم تصميمها فعليًا وفقًا للاحتياجات المختلفة. لا يمكن القول أن المرء يحل محل الآخر. على سبيل المثال ، في الحدث ، انقر فوق الزر أعلاه ، إذا كان رد اتصال غير متزامن ، فلن يظهر تأثير النقر فورًا بعد أن ينقر المستخدم على الزر ، ولن يقوم المستخدم بإجراء عمليات أخرى ، فسوف يشعر غريبًا. عروض الاتصالات غير المتزامنة لطلبات الشبكة ، نظرًا لأن المورد المطلوب قد لا يكون موجودًا ، فإن اتصال الشبكة غير مستقر ، وأسباب أخرى ، لا يكون المستخدم واضحًا بشأن تنفيذ الطريقة ، لذلك سيستخدمون عمليات الاتصال غير المتزامنة ، ويبدأون استدعاء الطريقة ويفعل أشياء أخرى ، ثم ينتظرون إخطار رد الاتصال.
تطبيق طريقة رد الاتصال في الاتصال
أساليب رد الاتصال المذكورة أعلاه ، باستثناء عمليات الاسترداد الخاصة بإطار طلب الشبكة ، لا تحتوي جميعها على معلمات. دعنا نلقي نظرة على إضافة معلمات إلى طريقة رد الاتصال لتنفيذ بعض مشاكل الاتصال.
إذا كنا نريد الحصول على بيانات الفئة A بعد سلسلة من الحسابات والمعالجة ، ولا يمكن للفئتين ببساطة الرجوع إلى بيانات الفئة A. يمكننا التفكير في عمليات الاسترجاعات.
الخطوات كما يلي:
الخطوات المذكورة أعلاه مجردة بعض الشيء. دعونا نلقي نظرة على مثال أدناه ، واحد هو العميل والآخر هو الخادم. يطلب العميل بيانات الخادم المستهلكة للوقت.
عميل الفئة العامة {خادم الخادم العام ؛ طلب السلسلة العامة ؛ // ارتباط خادم واحصل على مرجع الخادم. العميل العام Connect (Server Server) {this.server = server ؛ إرجاع هذا ؛ } // العميل ، تعيين طلب العميل العام setRequest (طلب السلسلة) {this.request = request ؛ إرجاع هذا ؛ } // إرسال طريقة الطلب بشكل غير كاف ، تعبير LAMDBA. public void enqueue (server.callback callback) {new thread (()-> server.setCallback (request ، callback)). start () ؛ }} خادم الفئة العامة {public string response = "هذا هو html" ؛ . New Thread (() -> {try {thread.sleep (5000) ؛ callback.onresponse (request + response) ؛} catch (interruptedException e) {E.PrintStackTrace () ؛ callback.onfail (e) ؛}}). start () ؛ } // اكتب واجهة في الفئة التي تمتلك رد الاتصال على الواجهة العامة {void onResponse (استجابة السلسلة) ؛ void onFail (قابل للرمي) ؛ }}بعد ذلك ، دعنا نلقي نظرة على مثال الاختبار:
الفئة العامة callbackTest {public static void main (string [] args) {client client = new client () ؛ client.connect (new server ()). setRequest ("ما هذا الملف؟"). enqueue (new server.callback () {Override public void onResponse (string response) {system.out.println (response) ؛} override public void onFail (throwable) {system.println ( }}النتائج كما يلي:
تم استلام الطلب ويتم حسابه ... ما هو هذا الملف؟ هذا هو HTML
ما سبق هو التواصل من خلال عمليات الاسترداد.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون محتوى هذه المقالة من بعض المساعدة في دراسة أو عمل الجميع. آمل أيضًا دعم wulin.com أكثر!