3

OK、これが取引です。Web URL から HTTP (post) データを介して要求するアプリをコーディングしました。データは JSON 配列を使用して返され、それらの配列を解析して必要なものを取得します。

Android 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;
}

誰が私が間違っているのか教えてもらえますか? または私が変更する必要があるもの、私は今少し探していましたが、Android 4で動作させることはできません.

ありがとう!

4

2 に答える 2

7

これを Async タスクに入れる必要があります。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();

私は数日前にまったく同じ問題を抱えていました。

于 2012-04-20T12:00:18.967 に答える
1

Android 4.0 では、スレッドを使用せずに http 接続を使用することはできません (実行可能な asyinctask ... を使用)。

あなたができる最善のことは、スレッドを実装することですが、それができない場合は、Android マニフェスト android:targetVersion="14" で削除できません。

Holo テーマなどのバージョン 14 以降の要素が必要な場合や、で構成できるものが必要な場合

プロジェクトで右クリック --> プロパティ --> Android --> Project Built Target = 14 または必要な

于 2012-04-20T12:02:09.127 に答える