2013-11-29 1 views
0

Как я должен использовать мой класс Окса для запроса JSON, bcoz в андроиде 2,3 работы, но андроид 4.хе не работаетandroid.os.networkonmainthreadexception в моей просьбе класса ответа на JSON

Я читал, что мне нужно использовать 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; 
}}} 

ответ

0

Не следует выполнять сетевые операции в основной теме 4.0 и выше. Прочитайте это, чтобы узнать, как выполнять сетевые операции правильно https://developer.android.com/training/basics/network-ops/connecting.html

+0

Im используя Handler (это Httppostaux), но с Android 4.x получил сообщение об ошибке. так, я хочу использовать тот же обработчик с asyntask, это не хорошо? так, иначе бы пришлось использовать в каждой асинхронной деятельности, это правильный путь? – MrKurapica

0

Здесь я положил образец кода для того, как я использую задачу Asyc для апи призванию, надеюсь, это поможет вам и изменить этот код в соответствии с вашими потребностями,

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" />

Смежные вопросы