هل يمكن أن يحدث خطأ في طلب Blackberry HTTP على الفور إذا لم يكن هناك اتصال متاح؟

StackOverflow https://stackoverflow.com/questions/825289

  •  05-07-2019
  •  | 
  •  

سؤال

لدي اتصال HTTP، فتحه

HttpConnection c = (HttpConnection)Connector.open(url);

أين url هو واحد من:

  • http://foo.bar;deviceside=false
  • http://foo.bar;deviceside=false;ConnectionType=mds-public
  • http://foo.bar;deviceside=true;ConnectionUID=xxxxxxx
  • http://foo.bar;deviceside=true;interface=wifi

هل هناك أي طريقة تؤدي إلى حدوث خطأ في الطلب على الفور إذا تعذر إنشاء الاتصال لأن الجهاز غير متصل بالشبكة؟كما هو الحال، يستغرق الأمر حوالي دقيقة حتى تنتهي المهلة في العديد من الحالات (تحديدًا عند المكالمة الأولى للحصول على المعلومات من الشبكة: c.getResponseCode())

يحرر:أعني خطأ خارجا.في إحدى الحالات، ستظل شبكة Wifi، على وجه التحديد، موجودة لعدة دقائق إذا لم تكن شبكة wifi قيد التشغيل قبل انتهاء المهلة، وأريد أن تتوقف على الفور.

هل كانت مفيدة؟

المحلول

انا استعمل ال معلومات الراديو فئة للتحقق مما إذا كان هناك اتصال وما إذا كان الراديو قيد التشغيل قبل محاولة إجراء اتصال.بعد ذلك، يمكنك فقط عرض رسالة للمستخدم أو تشغيل الراديو (إذا كان متوقفًا) قبل محاولة الاتصال، مما يوفر تجربة مستخدم أفضل بكثير.

جرب استخدام:

if (RadioInfo.getState() == RadioInfo.STATE_OFF)
OR
if (RadioInfo.getSignalLevel() == RadioInfo.LEVEL_NO_COVERAGE)

للتحقق من حالة الاتصال قبل الاتصال.

نصائح أخرى

أقوم بتغليف مشاركاتي في سلسلة محادثات حتى تنتهي المهلة بشكل أسرع.تأكد من أن "PostThread" الخاص بك يلتقط جميع الاستثناءات (ويحفظها).

public byte[] post(String url, byte[] requestString){
    PostThread thread=new PostThread(url, requestString);

    synchronized(thread){
        try{
            thread.start();
            thread.wait(TIMEOUT);
        }catch(Throwable e){

        }//method
    }//synch

    if (thread.isAlive()){
        try{
            thread.interrupt();
        }catch(Throwable e){

        }//method
        D.error("Timeout");
    }//endif

    if (thread.error!=null) D.error(thread.error);
    if (thread.output!=null) return thread.output;
    throw D.error("No output");
}//method

وهناك أيضا ConnectionTimeout المعلمة التي لم أختبرها:على سبيل المثال socket://server:80/mywebservice;ConnectionTimeout=2000

ليست بأي طريقة يمكن تحديدها برمجيا.يمكن أن يكون الأمر مزعجًا، ولكن الاتصال من جهاز محمول - خاصة جهاز BlackBerry - يمر بشكل عام عبر عدد قليل من الشبكات والبوابات المختلفة قبل الوصول إلى الخادم الوجهة:wireless->Carrier APN->Internet->BES (ربما)->foo.bar server لذلك يتم تضمين مهلة كبيرة لحساب التأخيرات المحتملة في أي من تلك النقاط.

يمكنك التحكم في مهلة اتصال الجهاز الافتراضية من خادم BES/MDS (أو في JDE، من ملف MDS\config impublic.property) - ولكن ربما لن يساعدك ذلك.

سيكون من الأفضل إجراء فحص المهلة من سلسلة رسائل مختلفة، لأن هذا سيحدث حتى عند إنشاء الاتصال، لنفترض أن زمن استجابة الشبكة مرتفع جدًا، لذلك لا تريد أن ينتظر المستخدم لفترة طويلة أو شيء من هذا القبيل.

لذلك، في هذه الحالة، قم بالتحقق من موضوع مختلف، ما إذا كان الوقت الحالي ناقص الوقت الذي تم إدخاله لبدء الاتصال أكبر من الوقت المحدد، قم بإغلاق الاتصال باستخدام Connection.Close()!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top