2012-02-23 5 views
6

मेरे पास एक ऑनक्लिक लिस्टनर है जो नेटवर्क कॉल ट्रिगर करता है, इसलिए मैं उपयोगकर्ता को यह दिखाने का कोई तरीका चाहता हूं कि संचार प्रगति पर है। जिस समस्या में मैं दौड़ रहा हूं वह यह है कि मैं ऑनक्लिक श्रोता के अंदर कॉल करने से पहले उस मामले के लिए किसी भी तरह से प्रोग्रेसडिअलॉग फेंकने या यूआई को किसी भी तरह से परिवर्तित नहीं कर सकता। सभी कोड ठीक काम करता है, लेकिन यूआई परिवर्तन तब तक प्रभावी नहीं होते जब तक कि क्लिकक्लिस्टरर के सभी कोड चलने के बाद तक।क्या ऑनक्लिक लिस्टनर यूआई अपडेट नहीं करता है जब तक कि इसके अंदर के सभी कोड एंड्रॉइड में नहीं चलते?

मैं अगर मेरी समस्या केवल यह है कि एक onclicklistener की तरह एक गुमनाम आंतरिक वर्ग केवल अपनी दौड़ के अंत में यूआई अद्यतन कर सकते हैं है सोच रहा था? या शायद मेरा कोड बस खराब है।

 relayButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       cPanel.throwProgress(NCDTCPRelayActivity.this); 

       System.out.println(tvSocketConnection.getText().toString()); 

       if (relayStatusArray[relayNumber] == 0) 
       { 
        if (cPanel.TurnOnRelay(relayNumber, 1) == false) 
        { 
         changeTitleToRed(); 
        }else{ 
         changeTitleToGreen(); 
        } 
       } 
       else { 
        if (cPanel.TurnOffRelay(relayNumber, 1) == false){ 
         changeTitleToRed(); 
        }else{ 
         changeTitleToGreen(); 
        } 
       } 
       cPanel.hideProgress(NCDTCPRelayActivity.this); 
      } 
     }); 

यहाँ throwProgress और hideProgress क्रमशः (इन गतिविधियों का एक उपवर्ग में हैं) के लिए कोड है::

अग्रिम

नीचे धन्यवाद onclick श्रोता के लिए कोड है

public boolean throwProgress(Context mContext) { 
    System.out.println("INSIDE THROWPROGRESS"); 
    try { 
     tempDialog = ProgressDialog.show(mContext, "Connecting", "Connecting", true); 
    } 
    catch (RuntimeException e) { 
     return false; 
    } 
    return true; 
} 
public boolean hideProgress(Context mContext) { 
    System.out.println("OUTSIDE THROWPROGRESS"); 
    tempDialog.hide(); 
    return true; 
} 

** संपादित करें ऑनक्लिक लिस्टनर के लिए नया कोड यहां दिया गया है कि मैंने इसे चलाने योग्य:

  public void onClick(View v) { 
       cPanel.throwProgress(NCDTCPRelayActivity.this); 
       System.out.println(tvSocketConnection.getText().toString()); 

       handler.post(new Runnable() { 

        @Override 
        public void run() { 
         // TODO Auto-generated method stub 
         if (relayStatusArray[relayNumber] == 0) 
         { 
          if (cPanel.TurnOnRelay(relayNumber, 1) == false) 
          { 
           changeTitleToRed(); 
          }else{ 
           changeTitleToGreen(); 
          } 
         } 
         else { 
          if (cPanel.TurnOffRelay(relayNumber, 1) == false){ 
           changeTitleToRed(); 
          }else{ 
           changeTitleToGreen(); 
          } 
         } 
         cPanel.hideProgress(NCDTCPRelayActivity.this); 
         relayStatusArray = cPanel.getBankStatus(1); 
         updateButtonText(); 
        } 

       }); 
      } 

उत्तर

3

आपके क्लिक हैंडलर से बदल रहा है यूआई ठीक काम करना चाहिए। समस्या यह है कि आप यूआई थ्रेड पर कुछ भारी काम कर रहे हैं और यह इसे अवरुद्ध कर रहा है ताकि जब तक कि यह काम पूरा नहीं हो जाता तब तक संवाद वास्तव में अपडेट नहीं होता है। सभी भारी भारोत्तोलन को एक AsyncTask में ले जाने का प्रयास करें (this doc पढ़ें यदि आप इससे अपरिचित हैं) कार्य पूर्ण होने पर संवाद छुपाएं और देखें कि यह ठीक करता है या नहीं।

+0

खैर नेटवर्क कॉल एक AsyncTask पर है, लेकिन मैं AsyncTask()। निष्पादित()। (मिल) पद्धति का उपयोग इतना है कि ui धागा क्योंकि पूरे कार्यक्रम हो रही उन नेटवर्क के लिए आदेश के लिए प्रयोग किया जाता है प्रतिक्रिया के लिए इंतजार करेंगे लक्ष्य और प्रतिक्रिया वापस लेना। यह सिर्फ एक काम है ताकि हमें मुख्य धागे पर नेटवर्क का अपवाद न मिले। हालांकि कॉल के पहले कोड कोड के पहले कोड से पहले निष्पादित नहीं किया जाएगा? – Poodimizer

+0

मुख्य धागे में get() को कॉल न करें। AsyncTask.onPostExecute() को ओवरराइड करें और वहां प्रतिक्रिया को संभालें। – gngr44

+1

@Poodimizer ऐसा मत करो! आप असीमित रूप से विस्तृत * तुल्यकालिक * कार्य में बदलकर 'AsyncTask' के पूरे उद्देश्य को प्रभावी ढंग से हरा रहे हैं! – Santa

3

सभी यूआई अद्यतन वहाँ काफी हर जीयूआई मंच पर Android पर देरी होती है, साथ ही। एक दृश्य के रूप में परिवर्तन कभी भी प्रस्तुत नहीं किया जाता है; इसके बजाए, जीयूआई उपप्रणाली दृश्य को "रेड्रो की जरूरत" के रूप में चिह्नित करती है, और कुछ समय बाद संदेश लूप पर draw() पर कॉल करती है।

आप जगह लेने के लिए कुछ न होने पर स्क्रीन अद्यतन किया गया है चाहते हैं, Handler.post() का उपयोग करें। post() 'एड कोड संदेश लूप पर कुछ समय निष्पादित करेगा, आमतौर पर कतारबद्ध ड्रा कोड से बाद में।

एक तरफ नोड: विंडोज जीयूआई कि शासन के लिए एक खुश अपवाद है, आप WM_PAINT के बाहर एक विंडोज़ विंडो पर ड्रॉ कर सकते हैं। लेकिन एंड्रॉइड पर आप नहीं कर सकते।

+0

मैंने एक रननेबल जोड़ने और इसमें नेटवर्क कॉल डालने का प्रयास किया, लेकिन मुझे अभी भी फेंक प्रोग्रेसबार की प्रोग्रेसडिअलॉग दिखाई नहीं दे रही है। क्या मैंने इसे सही तरीके से किया? मैंने मूल पोस्ट में एक नया खंड जोड़ा है जिसमें इसे चलाने योग्य है। – Poodimizer

संबंधित मुद्दे