3

好的,这就是交易,我编写了一个应用程序,该应用程序通过来自 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

你需要把它放在一个异步任务中,它不会在 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 manifest android:targetVersion="14" 中删除。

如果您需要 14 或更高版本的某些元素,例如 Holo 主题或您可以在其中配置的东西

在项目中右击 --> Propierties --> Android --> Project Built Target = 14 或者你想要的

于 2012-04-20T12:02:09.127 回答