2011-01-27 6 views
13

मेरी कोड में मैं इसHonyComb और DefaultHttpClient

 Log.d("WFlog (executeRequest)", request.toString()) ; 
     httpResponse = client.execute(request); 
     Log.d("WFlog (execute)", request.toString()) ; 

का उपयोग कर Android 2.2 ठीक जा रहा है और logcat में मैं दोनों लॉग लाइनों को देखने के अनुप्रयोग चल रहा है।

अब कोड के उसी टुकड़े के लिए होनीकॉम्ब का उपयोग करके ऐप चला रहा है, ऐसा लगता है कि मैं क्लाइंट को कभी भी पारित नहीं करता हूं। ठीक से निष्पादित करें। मुझे मिली अंतिम लॉग लाइन "WFlog (executeRequest)" है।

01-27 21:54:45.169: WARN/System.err(390): android.os.NetworkOnMainThreadException 
01-27 21:54:45.196: WARN/System.err(390):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1069) 
01-27 21:54:45.196: WARN/System.err(390):  at dalvik.system.BlockGuard$WrappedNetworkSystem.connect(BlockGuard.java:368) 
01-27 21:54:45.205: WARN/System.err(390):  at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:208) 
01-27 21:54:45.215: WARN/System.err(390):  at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:431) 
01-27 21:54:45.237: WARN/System.err(390):  at java.net.Socket.connect(Socket.java:901) 

किसी भी विचार मैं के लिए क्या दिखना चाहिए:

इस के बाद मैं निम्नलिखित देखते हैं?

उत्तर

32

ऐसी नई नीतियां हैं जो एप्लिकेशन और ऑपरेटिंग सिस्टम डेवलपर्स को कुछ थ्रेड पर कोड निष्पादन के लिए प्रदर्शन अपेक्षाओं को सेट करने की अनुमति देती हैं। आपने अपने आवेदन के ui थ्रेड पर अवरुद्ध नेटवर्क एपीआई का आह्वान करने का प्रयास किया है। Google ने एक प्रणाली स्थापित की है जो आपको यह बताने देती है कि यह एक बुरा विचार है और आप अपने अनुरोध को एक अलग थ्रेड या एसिंक टास्क में निष्पादित करके इस समस्या को हल कर सकते हैं।

कृपया this ब्लॉग पोस्ट पढ़ें। आप एसओ और Google पर एसिंक/बहु-थ्रेडेड ऐप्स करने के बारे में जानकारी पा सकते हैं।

+0

ब्लॉग पोस्ट को इंगित करने के लिए धन्यवाद। इसे पढ़ने के बाद और मेरे ऐप पर कुछ पुनर्लेखन करने के आधार पर यह अब काम कर रहा है। यह asyncTask इस में मेरी मदद कर रहा था। तो इस पर आपकी मदद के लिए धन्यवाद। –

5

धन्यवाद निक। यह मेरे लिए काम किया। देव उद्देश्य के लिए मैंने इसे

*ThreadPolicy tp = ThreadPolicy.LAX; 
StrictMode.setThreadPolicy(tp);* 

द्वारा डिफ़ॉल्ट रूप से थ्रेड नीति को डिफ़ॉल्ट रूप से सेट किया है, इसे अंतिम संस्करण के लिए हटा दिया जाना चाहिए।

3

abhinaw के सुझाव प्रतिबिंब के रूप में लिखा है, तो कोड भी पुराने API संस्करण पर काम करता है:

try { 
     Class strictModeClass=Class.forName("android.os.StrictMode"); 
     Class strictModeThreadPolicyClass=Class.forName("android.os.StrictMode$ThreadPolicy"); 
     Object laxPolicy = strictModeThreadPolicyClass.getField("LAX").get(null); 
     Method method_setThreadPolicy = strictModeClass.getMethod(
       "setThreadPolicy", strictModeThreadPolicyClass); 
     method_setThreadPolicy.invoke(null,laxPolicy); 
    } catch (Exception e) { 

    } 

हाँ, यह अंतिम संस्करण के लिए हटा दिया जाना चाहिए।

3

मैंने एक एसिन्टास्क का उपयोग किया, इसे अन्य धागे में देखा, और यह ठीक काम किया .... मैं एक सबक्लास बना रहा हूं जहां मैं नेटवर्क कनेक्शन को कॉल करना चाहता था। मुझे नहीं पता कि यह सबसे अच्छा तरीका है लेकिन यह कोड मेरे लिए काम करता है ....

public miclase{ 

    public boolean comprobarMP3(int canal){ 
     boolean retorno=true; 
     //This commented Code is what it was NOT working 
     //swr= new ServicioWebRest(); 
     //contenido=swr.obtieneContenido(Channels.getInstance().getChannel().get(canal).getId()); 
     try{ 
      //this.get() was important, i had troubles in recovering the objet, .get() solved it 
      contenido=new getContenidoAsync().execute(canal).get(); 
     }catch(Exception e){ 
      contenido=null; 
     } 
    } 

    //Clase interna para acceder a los webservice de un modo asincrono en otro hilo 
    //Desde el sdk 11, las politicas de seguridad de android no permiten acceder a internet desde el hilo principal 
    public class getContenidoAsync extends AsyncTask<Integer, Void, Contenido>{ 
     Contenido c=new Contenido(); 

     @Override 
     protected Contenido doInBackground(Integer... urls) { 
     //aqui el codigo q sea, yo llamo a este que llama a otra clase que es el q llama a http 
      return new ServicioWebRest().obtieneContenido(Channels.getInstance().getChannel().get(urls[0]).getId()); 
     } 

     @Override 
     protected void onPostExecute(Contenido result) { 
      c=result; 
     }  
    } 
} 

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

  • कोई संबंधित समस्या नहीं^_^