اذهب إلى المحتوى
  • 0

تشغيل دالتين بالترتيب بحيث لا تبدأ الأولى حتى تكتمل الثانية -Android Studio-

Mohamed Foudane

السؤال

السلام عليكم 

هل هناك امكانية لتشغيل دالتين بالترتيب بحيث لا تبدأ الأولى حتى تكتمل الثانية ؟

تعبت في البحث عن طريقة للقيام بهذا ..

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

الفكرة ببساطة هي :

 

private void loadBannerAd () {
  
    ...//الدالة الأولى
    ...
}


private void showBannerAd () {
  
    ...//الدالة الثانية
    ...
}

 

عند استدعاء الدالة الثانية التي هي showBannerAd لا اريد ان تشتغل حتى تنتهي الأولى

لأن الأولى تستغرق قليل من الوقت وبذلك قد لا يظهر الإعلان لأن التحميل لم يكتمل بعد !!!

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 4 دقائق مضت قال Med Foud:

الفكرة ببساطة هي :

شكرا لإرفاق الشيفرة، أنا أفهم هذا الأمر، لكن أحتاج لفهم دقيق للعمليات التي تقوم بها كلا الدالتين لاستخدام تعليمات برمجية من الممكن أن تحل المشكلة، 

يفترض أن البرمجة متزامنة و أن استدعاء الدوال تسلسلي، فكيف يتم استدعاء دالة قبل انتهاء ما قبلها؟

يمكن تجريب حل بسيط وهو استدعاء الدالة الثانية ضمن الدالة الأولى في آخر سطر لها مثلاً .. 

private void loadBannerAd () {
  
    ...//الدالة الأولى
    ...

	showBannerAd();
}

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        loadAdmobBanner();
    }

    public void loadAdmobBanner() {
      
        try {
            admobBanner = new AdView(this);
            admobBanner.setAdSize(AdSize.BANNER);
            admobBanner.setAdUnitId(this.getResources().getString(R.string.admob_banner_id));
            AdRequest adRequest = new AdRequest.Builder().build();
            admobBanner.loadAd(adRequest);

        } catch (Exception ignored) {
        }
    }

  

    public static void showBannerAd (Activity activity, LinearLayout adContainer) {

        try {

            adContainer.addView(admobBanner);

        } catch (Exception ignored) {
        }


    }

 

هذا هو الكود، لاحظ معي ان دالة loadAdmobBanner باستدعائها في MainApplication Class.

في حين اقوم بإستدعاء دالة showAdmobBanner في MainActivity مثلا...

في حالة تأخر اعلان البانر في التحميل بسبب ضعف الانترنيت مثلا وإشتغلت MainActivity قبل انتهاء تحميل الإعلان فإنه لن يظهر حتى اعمل refresh ل MainActivity.

 

هل اتضح المشكل سيدي ام لا ؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 10 دقائق مضت قال Med Foud:

هل اتضح المشكل سيدي ام لا ؟

تمام،

حسب مفهوم android life cycle بعد انتهاء إنشاء العرض أي انتهاء الدالة on Create يتم مناداة on Start

يمكنك نقل استدعاء الدوال التي يجب تنفيذها بعد نهاية الإنشاء ل on Start حاول إضافة هذه:

@Override
  public void onStart () {
  super.onStart();

  showAdmobBanner();
}

أو مجرد نقل الاستدعاء لنهاية loadAdmobBanner

  public void loadAdmobBanner() {
      
        try {
            admobBanner = new AdView(this);
            admobBanner.setAdSize(AdSize.BANNER);
            admobBanner.setAdUnitId(this.getResources().getString(R.string.admob_banner_id));
            AdRequest adRequest = new AdRequest.Builder().build();
            admobBanner.loadAd(adRequest);

// هنا
			showAdmobBanner();

        } catch (Exception ignored) {
        }
    }

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 16 دقائق مضت قال Med Foud:

المشكلة كما ذكرت ان showAdmobBanner لا استدعيها في نفس Activity 

هل حاولت استعمال startActivityForResult أي تقوم بتشغيل نشاط آخر و بعد انتهائه و تعود بنتيجة نشغل دالة في النشاط الحالي؟

نبدأ النشاط رقم 2 من النشاط رقم 1

button1.setOnClickListener(new OnClickListener() {  
                           @Override  
                           public void onClick(View arg0) {  
  Intent intent=new Intent(MainActivity.this,SecondActivity.class);  
  startActivityForResult(intent, 2);// Activity is started with requestCode 2  
}  
}); 

بعد العودة من النشاط 2 للنشاط 1 نستدعي الدالة

@Override  
protected void onActivityResult(int requestCode, int resultCode, Intent data)  
{  
  super.onActivityResult(requestCode, resultCode, data);  
  // check if the request code is same as what is passed  here it is 2  
  if(requestCode==2)  
  {  
    // استدعاء الدالة
  }  
}  

 

بتاريخ 49 دقائق مضت قال Med Foud:

المشكلة كما ذكرت ان showAdmobBanner لا استدعيها في نفس Activity 

الحل الأمثل هو عمل async task ثم ضمن الدالة do in background يمكنك تنفيذ الدوال وراء بعضها.

أو استخدام executor

Executor executor = anExecutor();
 executor.execute(new RunnableTask1());
 executor.execute(new RunnableTask2());

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...