【问题标题】:HTTP POST request ANDROID 4 (working in 2.3)?HTTP POST 请求 ANDROID 4(在 2.3 中工作)?
【发布时间】:2012-04-20 11:53:34
【问题描述】:

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

谢谢!

【问题讨论】:

  • 假设你得到android.os.NetworkOnMainThreadException ...你不应该在主线程上进行互联网操作...使用线程(fx.: AsyncTask)
  • 作为使用 AsyncTask 的替代方法,请查看答案 here 看看是否有帮助。
  • @yorkw 这个答案真的是非常糟糕的做法,在异步任务中这样做会好 100%。
  • @SmartLemon,正如我在最后的回答中提到的那样。另请注意,您所说的真正糟糕的做法是存在的,并且在 API 级别 11 之前允许很长时间。

标签: android http-post android-4.0-ice-cream-sandwich http-request


【解决方案1】:

你需要把它放在一个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();

几天前我也遇到了同样的问题,祝你好运

【讨论】:

    【解决方案2】:

    在 Android 4.0 中,您不能在不使用线程的情况下使用 http 连接(使用可运行的 asyinctask ...)

    你能做的最好的就是实现一个线程,但如果你做不到,你就不能在 android manifest android:targetVersion="14" 中删除。

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

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

    【讨论】:

    • 这不是一个好主意,他们这样做的原因是当您执行任何网络请求时,它会阻塞可能导致 FC 的主 UI 线程,我们不希望这种情况发生所以我们需要在一个线程中进行,他们让它滑动,因为我认为开发人员似乎不会这样做。
    • 我知道,但我认为最好的办法是实现一个线程,但有时由于某种原因无法做到这一点,这是一个暂时的解决方案。我重申,最好的方法是实现一个 AsyncTask 来进行 HTTP 请愿,始终如您所说。我投票赞成你的回答,但我认为把这个“坏”的解决方案也很好。
    • @Aracem 你也可以禁用严格模式....但是真的,真的,真的,......,真的很糟糕的做法
    • 我知道@Selvin 但是,我之前怎么说,也许在某些情况下可以帮助某人。 Repit,最好的是 SmartLemon 解决方案!
    猜你喜欢
    • 2012-07-10
    • 2018-11-22
    • 1970-01-01
    • 2013-10-22
    • 2013-02-03
    • 2023-03-22
    • 2015-03-08
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多