2012-04-20 20 views
3

さて、ここでは、私はWeb URLからHTTP(ポスト)データを要求するアプリケーションをコーディングしました。データはJSon配列を使用して返され、それらの配列を解析して必要なものを取得します。HTTP POST要求アンドロイド4(2.3で動く)?

アンドロイド2.3.xを使用しても問題はありませんが、Android 4でテストすると全く動作しません。ここで

は私のコードです:

public boolean testConexio(){ 

    boolean status = false; 

    String rutaServer = "URL.php"; 
    //Log.e("log_tag", "Ruta server: "+rutaServer); 
    InputStream is = null; 
    String result = ""; 
    String temporal; 

    //Valors a demanar/enviar 
    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
    nameValuePairs.add(new BasicNameValuePair("param1",config.getUserDB())); // parametros POST! 
    nameValuePairs.add(new BasicNameValuePair("param2",config.getPassDB())); // parametros POST! 

    //http post 
    try{ 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost(rutaServer); 
     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs,"UTF-8")); // valors POST UTF 8 coded <-- I KNOW! this is the way i need them spanishfag here 
     HttpResponse response = httpclient.execute(httppost); 
     HttpEntity entity = response.getEntity(); 
     is = entity.getContent(); 
    }catch(Exception e){ 
     Log.e("log_tag", "Error in http connection "+e.toString()); 
    } 

    //Convierte la respuesta a String 
    try{ 
     BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-8"),8); // again, spanishfag here 
     StringBuilder sb = new StringBuilder(); 
     String line = null; 
     while ((line = reader.readLine()) != null) { 
      sb.append(line + "\n"); 
     } 
     is.close(); 
     result=sb.toString(); 
    }catch(Exception e){ 
     Log.e("log_tag", "Error converting result "+e.toString()); 
    } 

    //Parse la respuesta JSon 
    try{ 
     JSONObject jArray = new JSONObject(result); 
     temporal = jArray.getString("status"); 
     if(temporal.equals("true")){ 
      status = true; 
     } 
     Log.i("log_tag","Status: "+jArray.getString("status")); 
    }catch(JSONException e){ 
     Log.e("log_tag", "Error parsing data "+e.toString()); 
    } 

    return status; 
} 

誰も私が間違ってやっているものを私に伝えることができますか?または私が変更する必要があるもの、私は少し今探していて、私はアンドロイド4で動作させることはできません。

ありがとう!

+2

あなたは 'android.os.NetworkOnMainThreadException'を受け取ったと仮定します...あなたはメインスレッドでインターネット操作を行うべきではありません...スレッドを使う(fx .: AsyncTask) – Selvin

+0

AsyncTaskそれが役立つかどうかを調べるには、答え[ここ](http://stackoverflow.com/questions/8706464/defaulthttpclient-to-androidhttpclient/8706961#8706961)を参照してください。 – yorkw

+0

@yorkwその答えは本当に本当に本当に悪いことですが、非同期タスクでそれを行う方が100%良いでしょう。 – FabianCook

答えて

7

は、あなたはそれが3.0>

使用中のメインスレッドで実行されません、非同期タスクでこれを配置する必要があり、この:

public class PostTask extends AsyncTask<Void, String, Boolean> { 

     @Override 
     protected Boolean doInBackground(Void... params) { 
      boolean result = false; 

      //All your code goes in here 

      //If you want to do something on the UI use progress update 

      publishProgress("progress"); 
      return result; 
     } 

     protected void onProgressUpdate(String... progress) { 
      StringBuilder str = new StringBuilder(); 
       for (int i = 1; i < progress.length; i++) { 
        str.append(progress[i] + " "); 
       } 

     } 
    } 

あなたは非同期タスク

外への参照を必要とします
PostTask posttask; 

その後、あなたはそれを

posttask = new PostTask(); 
posttask.execute(); 
01を起動する必要があります

私はグッドラック、数日前とまったく同じ問題を抱えていたあなたがスレッド使用せずにHTTP接続を使用カントアンドロイド4.0では

1

(実行可能、asyinctaskとし...)

あなたができる最善をdoはThreadを実装していますが、できない場合はアンドロイドマニフェストのアンドロイドで削除できません:targetVersion = "14"

あなたはホロのテーマやプロジェクトで

右チャリンという音に設定することができます何かのように14 /上位バージョンのいくつかの要素が必要な場合 - > Propierties - >アンドロイド - ターゲット= 14または内蔵>プロジェクトあなたは望みます

+2

これは非常に良いアイデアではありません。彼らがこれをやった理由は、 FCを引き起こす可能性のあるメインのUIスレッドをブロックします。私たちはスレッドでそれを行う必要があるので、そのようなことが起こらないようにします。開発者が思うように見えなかったのでスライドさせます。 – FabianCook

+0

私は知っているが、私はスレッドを実装するのが最善のことをマークしているが、何らかの理由でそれを実行するために不可能ないくつかの時間があり、これは瞬間的な解決策である。最高の、私は、repit、AsyncTaskを実装してHTTPの申請をすることができます。私はあなたの答えを投票するが、私は良いthit "悪い"解決策を置くと思います。 – Aracem

+0

@Aracem厳格なモードを無効にすることもできます....しかし、本当に、本当に、本当に、悪い練習です。 – Selvin

関連する問題