我的JSON请求响应类中的android.os.networkonmainthreadexception错误

时间:2013-11-29 08:04:52

标签: java android json

我应该如何使用我的辅助类进行JSON请求,bcoz在android 2,3工作但是android 4.x不工作

我读到我需要使用Asyntask来修复它,或者创建线程,我更喜欢Asyntask但是我无法编译它。

如何修复asyntask的代码?

 public class Httppostaux {

  InputStream is = null;
  String result = "";

  public JSONArray getserverdata(ArrayList<NameValuePair> parameters, String urlwebserver ){

      //conecta via http y envia un post.
  httppostconnect(parameters,urlwebserver);

  if (is!=null){//si obtuvo una respuesta

      getpostresponse();

     return getjsonarray();

  }else{

      return null;

  }

  }


  //peticion HTTP
private void httppostconnect(ArrayList<NameValuePair> parametros, String urlwebserver){

//
try{
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(urlwebserver);
        httppost.setEntity(new UrlEncodedFormEntity(parametros));
        //ejecuto peticion enviando datos por POST
        HttpResponse response = httpclient.execute(httppost); 
        HttpEntity entity = response.getEntity();
         is = entity.getContent();

}catch(Exception e){
        Log.e("log_tag", "Error en la conexión HTTP "+e.toString());
}

 }

  public void getpostresponse(){

//Convierte respuesta a String
try{
        BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
        }
        is.close();

        result=sb.toString();
        Log.e("getpostresponse"," result= "+sb.toString());
}catch(Exception e){
        Log.e("log_tag", "Error conviertiendo el resultado "+e.toString());
}

 }

  public JSONArray getjsonarray(){
//parse json data
try{
      JSONArray jArray = new JSONArray(result);

      return jArray;
}
catch(JSONException e){
        Log.e("log_tag", "Error parsing data "+e.toString());
        return null;
}}} 

2 个答案:

答案 0 :(得分:0)

您不应在主线程4.0及更高版本上执行网络操作。阅读本文以了解如何正确执行网络操作https://developer.android.com/training/basics/network-ops/connecting.html

答案 1 :(得分:0)

这里我给出了如何使用Asyc任务进行api调用的示例代码,希望它对您有所帮助,并根据您的需要修改此代码,

new Read().execute(); // Asyc Task initialization 



    public class Read extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub

            try {
                json = lastTweet(); // url executed here  and the final value is stored in json obj

            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            // TODO Auto-generated method stub
            // Here you call the json obj and do your UI binding.
        }

    }

        public JSONObject lastTweet() throws ClientProtocolException, IOException,
            JSONException {
            HttpClient  client = new DefaultHttpClient();
        StringBuilder url = new StringBuilder(<your_URL>);
        HttpGet get = new HttpGet(url.toString());
        HttpResponse r = client.execute(get);

        int status = r.getStatusLine().getStatusCode();

        if (status == 200) {
            HttpEntity e = r.getEntity();
            String data = EntityUtils.toString(e);
            Log.e("RESPONSE VALUE IS", data); // Here you get the response
            JSONObject last = new JSONObject(data);
            return last; //here the response value is returned

        } else {
            Toast.makeText(getBaseContext(), "error", Toast.LENGTH_SHORT);
            return null;
        }
    }

在您的manifest.xml中,不要忘记添加此权限<uses-permission android:name="android.permission.INTERNET" />