entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

ArrayList No me carga los datos

El caso es que estoy haciendo una consulta a un servidor vía post, la cual funciona bien puedo hacer dicha consulta y me muestra los resultado si y solo si cambio la linea cargaListado(obtDatosJSON(res)); la cambio por un toast al pasar la variable a un ArrayList no me carga los datos y tampoco me da un error.

final Button button1=(Button)findViewById(R.id.button1);
    button1.setOnClickListener(new OnClickListener(){

    public void onClick(View view) {
        Thread nt = new Thread() {
            @Override
            public void run() {

                EditText cedula = (EditText) findViewById(R.id.editconsul);
                try {
                    final String res;

                        res = enviarPost(cedula.getText().toString());

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {

                        cargaListado(obtDatosJSON(res));
                    }
                });
                }catch (Exception e) {
            // TODO: handle exception

        };
            }
        };
        nt.start();
    }
    });
    }

public void cargaListado(ArrayList<String> res){
    ArrayAdapter<String> adaptador =
    new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, res);
    ListView listado = (ListView) findViewById(R.id.listarcon);
    listado.setAdapter(adaptador);
}

public ArrayList<String> obtDatosJSON(String ent){
    ArrayList<String> listado= new ArrayList<String>();
    try {
        JSONArray json= new JSONArray(ent);
        String texto="";
        for (int i=0; i<json.length();i++){
            texto = json.getJSONObject(i).getString("cedula") +" - "+
                    json.getJSONObject(i).getString("nombre") +" - "+
                    json.getJSONObject(i).getString("apellido") +" - "+
                    json.getJSONObject(i).getString("direccion");
            listado.add(texto);
        }
    } catch (Exception e) {
        // TODO: handle exception
        Toast toast2 =
                Toast.makeText(getApplicationContext(), "No tiene caso creado", Toast.LENGTH_SHORT);

            toast2.setGravity(Gravity.CENTER|Gravity.CENTER,0,0);

            toast2.show();

    }
    return listado;
}

0voto

wroque comentado

que enojon, solo bromeaba.

0voto

Luis Moreno comentado

Sigo sin resolver y debo entregar eso el viernes en la universidad alguien tendrá donde la consulta via post me rellena una lista

0voto

wroque comentado

que mal. bueno te aconsejo crear un archivo.json y dejar ahi el contenido de los objetos que necesitas visualizar. Luego simplemente lees el contenido del archivo dentro de tu proyecto y realizas las pruebas.

0voto

Luis Moreno comentado

Hice un nuevo archivo php json y me da el mismo error. aqui les dejo el codigo a ver si alguien ve el error. Gracias por su ayuda.

public class MainActivity extends Activity {

private ListView listado;
private String nombre; String apellido; String direccion;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final Button button1=(Button) findViewById(R.id.button1);
    button1.setOnClickListener(new OnClickListener(){

    public void onClick(View view) {

        listado = (ListView) findViewById(R.id.listarcon);
        Thread nt = new Thread() {
            @Override

            public void run() {

                EditText cedula = (EditText) findViewById(R.id.editconsul);
                try {
                    final String res;

                        final String res1 = enviarPost(cedula.getText().toString());
                        Log.e("resultado", res1);

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {

                        cargaListado(obtDatosJSON(res1));
                    }
                });
                }catch (Exception e) {
            // TODO: handle exception

        };
            }
        };
        nt.start();
    }
    });
    }

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

public String enviarPost(String cedula) {

    HttpClient httpClient = new DefaultHttpClient();
    HttpContext localContext = new BasicHttpContext();
    HttpPost httpPost = new HttpPost(
            "http://www.lmorenoprueba.esy.es/consulta.php");
    HttpResponse response = null;
    try {

        List<NameValuePair> params = new ArrayList<NameValuePair>(3);
        params.add(new BasicNameValuePair("cedula", cedula));
        params.add(new BasicNameValuePair("nombre", nombre));
        params.add(new BasicNameValuePair("apellido", apellido));
        params.add(new BasicNameValuePair("direccion", direccion));
        httpPost.setEntity(new UrlEncodedFormEntity(params));
        HttpResponse resp = httpClient.execute(httpPost);
         HttpEntity ent = resp.getEntity();
         cedula = EntityUtils.toString(ent, "UTF-8");

    } catch (Exception e) {
        // TODO: handle exception
        Toast toast2 =
                Toast.makeText(getApplicationContext(), "No tiene conexión a Internet", Toast.LENGTH_SHORT);

            toast2.setGravity(Gravity.CENTER|Gravity.CENTER,0,0);

            toast2.show();
    }
    return cedula;

}

public void cargaListado(ArrayList<String> ent){
    ArrayAdapter<String> adaptador =
    new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, ent);
    ListView listado = (ListView) findViewById(R.id.listarcon);
    listado.setAdapter(adaptador);
}

public ArrayList<String> obtDatosJSON(String ent){
    ArrayList<String> listado= new ArrayList<String>();
    try {
        JSONArray json= new JSONArray(ent);
        String texto="";
        for (int i=0; i<json.length();i++){
            texto = json.getJSONObject(i).getString("cedula") +" - "+
                    json.getJSONObject(i).getString("nombre") +" - "+
                    json.getJSONObject(i).getString("apellido") +" - "+
                    json.getJSONObject(i).getString("direccion");
            listado.add(texto);
        }
    } catch (Exception e) {
        // TODO: handle exception
        Toast toast2 =
                Toast.makeText(getApplicationContext(), "No tiene caso creado", Toast.LENGTH_SHORT);

            toast2.setGravity(Gravity.CENTER|Gravity.CENTER,0,0);

            toast2.show();

    }
    return listado;
}

1voto

Lukard comentado

Te está sucediendo exactamente lo mismo en el método enviarPost(...). Pero lo que está mal aquí es el concepto.

Los widgets (en tu caso el Toast) hay que tratarlos en el thread de pantalla. Y las llamadas a Internet en un thread en background, ya que estas operaciones pueden ser (y en general lo son) largas.

Mi recomendación es que solo invoques el método runOnUiThread(...) cuando utilices widgets (como el Toast o el EditText) dentro del Thread nt que has creado.

De hecho podrias crear un método del estilo

private void muestraToast(final String textoQueMostrar) {
  runOnUiThread(new Runnable() {
    Toast toast = Toast.makeText(MainActivity.this, textoQueMostrar, Toast.LENGTH_SHORT);
    toast.setGravity(Gravity.CENTER,0,0);
    toast.show();
  });
}

Y con esto ya puedes llamar siempre a este método y olvidarte de problemas con el thread de pantalla.

1 Respuesta

1voto

binamonk Puntos3790

Creo que traes problemas con los contextos, por que no intentas quitar el tryCatch del método obtDatosJson y mejor lo implementas en

 runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                        cargaListado(obtDatosJSON(res));
                        } catch {
                           // ... Mostrar Toast ...
                        }
                    }
                });

obviamente tendrias que sacar el metodo del try catch que usas para atrapar errores del metodo enviarPost asi tendrias dos handlers, uno para la comunicacion de red y otro para el parseo.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta