2011-01-27 9 views
13

は罰金起こっているとlogcatに私は両方のログの行を参照してください。HonyCombとDefaultHttpClient私のコードで

HonyCombを使って同じコードを実行すると、client.executeが正しく渡されることはありません。私が得る最後のログラインは、 "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スレッドでブロッキングネットワークAPIを呼び出そうとしました。 Googleはこれが悪い考えであることを知らせるシステムを導入しており、別のスレッドまたはasyncTaskでリクエストを実行することでこの問題を解決できます。

ブログ投稿thisをお読みください。あなたはSOとGoogleのすべてで非同期/マルチスレッドアプリケーションを行うことについての情報を見つけることができます。

+0

ブログの記事を指摘してくれてありがとう。これを読んだ後、私のアプリでいくつかの書き直しをすることに基づいて、今働いています。これを助けるasyncTaskでした。だからこそあなたの助けをありがとう。 –

5

ありがとうございました。それは私のために働いた。 devの目的のために、私はちょうどこれを行うことによってデフォルトにスレッドポリシーを設定しました

*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

私はasynctaskを使って他のスレッドでそれを見て、うまくいきました。私はネットワーク接続を呼びたいサブクラスを作成します。私はそれが最善の方法であるかわからないが、このコードは私のために働いた....

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; 
     }  
    } 
} 
関連する問題