Problema con AsyncTask

35 views
Skip to first unread message

Frenando Garcia

unread,
Jul 26, 2016, 2:37:25 AM7/26/16
to desarrolladores-android
Hola a todos:

Estoy probando todo el tema de lectura de datos desde una web (la mia de prueba) , y , cuando presiono un boton, en vez de mostrarme el contenido de un archivo txt en un textview me pone el siguiente mensaje:

com.proyecto.ejemplohttppost.MainActivity$MiTarea@41974030

Si pulso el boton mas veces el mensaje cambia los numeros finales , por ejemplo:

com.proyecto.ejemplohttppost.MainActivity$MiTarea@419bab00

MainActivity es mi actividad principal y la unica del programa, y MiTarea extiende de AsyncTask. En el manifest tiene puesto el permiso de Internet y antes de conectarme a la url compruebo que tengo conexion a internet. El codigo completo es e que sigue:

package com.proyecto.ejemplohttppost;

import android.app.Activity;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class MainActivity extends Activity {

private Boolean hayConexion=false;
public TextView tvData;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button btnHit=(Button)findViewById(R.id.btnHit);
tvData=(TextView)findViewById(R.id.tvJsonItem);

String res = "";
ConnectivityManager connMgr = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();

if (networkInfo != null && networkInfo.isConnected()) {
Toast.makeText(MainActivity.this, "!!!! Tenemos conexion !!!!", Toast.LENGTH_LONG).show();
hayConexion=true;

} else {
Toast.makeText(MainActivity.this, "FALLO AL CONECTAR", Toast.LENGTH_LONG).show();
hayConexion=false;
}

btnHit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {

if(hayConexion) {
String miUrl="www.tesistev1.esy.es/indexcaca.txt";
String caca="";
//new MiTarea().execute(miUrl).toString();
tvData.setText((new MiTarea().execute(miUrl)).toString());
//tvData.setText(buffer.toString());
//tvData.setText(caca);
}
}
});
}

private class MiTarea extends AsyncTask<String,Float,StringBuffer >{

@Override
protected void onPreExecute() {
super.onPreExecute();
}

@Override
protected StringBuffer doInBackground(String... strings) {
String cadena=strings[0];
HttpURLConnection connection=null;
StringBuffer buffer2=new StringBuffer();
BufferedReader reader=null;
try {
URL url = new URL("www.teasistev1.tk/indexcaca.txt");
connection = (HttpURLConnection) url.openConnection();
connection.connect();

InputStream stream = connection.getInputStream();

reader = new BufferedReader(new InputStreamReader(stream));

StringBuffer buffer = new StringBuffer();

String line = "";

while ((line = reader.readLine()) != null) {
buffer.append(line);

}
buffer=buffer2;
//tvData.setText(buffer.toString());

} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.disconnect();
}
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return buffer2;
}

@Override
protected void onProgressUpdate(Float... values) {
super.onProgressUpdate(values);
}

@Override
protected void onPostExecute(StringBuffer sb) {
super.onPostExecute(sb);
}
}
}

¿Alguna idea?

Francisco Lopez Montoya

unread,
Jul 26, 2016, 2:41:27 AM7/26/16
to desarrollad...@googlegroups.com

Estas estableciendo como texto el objeto en vez del resultado de la consulta


--
Para participar es necesario que leas detenidamente las normas del grupo: https://goo.gl/xeTRQm
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a desarrolladores-a...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/desarrolladores-android.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/desarrolladores-android/04c07b97-9e4c-4a6a-b9e7-d58275a38b98%40googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Frenando Garcia

unread,
Jul 26, 2016, 3:19:52 AM7/26/16
to desarrolladores-android
Originalmente en el codigo despues de:

while ((line = reader.readLine()) != null) {
buffer.append(line);
}

Habia un:

tvData.setText(buffer.toString());

Pero el programa me daba error porque me decia a su manera que no podia hacer eso dentro del hilo principal, por eso cree la clase MiTarea().

¿No es lo mismo lo que habia antes con lo que hay ahora?




Francisco Lopez Montoya

unread,
Jul 26, 2016, 8:10:10 AM7/26/16
to desarrollad...@googlegroups.com

Modifica la vista en el postexecute con el resultado de la peticion


--
Para participar es necesario que leas detenidamente las normas del grupo: https://goo.gl/xeTRQm
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a desarrolladores-a...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/desarrolladores-android.

Gabriel Pozo

unread,
Jul 26, 2016, 8:46:01 AM7/26/16
to desarrollad...@googlegroups.com
Como dice Francisco, mirá la documentación de AsyncTask: https://developer.android.com/reference/android/os/AsyncTask.html
En el onPreExecute podrías disparar un cargador, hacer tu petición en el doInBackground, y cerrar el cargador y configurar el texto con tvData.setText(""); en el onPostExecute  ;)
Tené en cuenta que nunca podes modificar la UI desde otro hilo que no sea el principal, y también lo opuesto con conexiones de red, o sea no podes hacer peticiones http desde el hilo principal ;)

Gabriel Pozo

unread,
Jul 26, 2016, 8:49:02 AM7/26/16
to desarrollad...@googlegroups.com
Lee bien esto de la documentación oficial, para que comprendas bien lo último que te dije sobre el hilo principal, la UI y las conexiones de red ;)
https://developer.android.com/training/basics/network-ops/connecting.html
https://developer.android.com/training/multiple-threads/communicate-ui.html
https://developer.android.com/training/articles/perf-anr.html

Frenando Garcia

unread,
Jul 26, 2016, 9:53:44 AM7/26/16
to desarrolladores-android
Gracias, les echare un vistazo a ver si me aclaro.

Gabriel Pozo

unread,
Jul 26, 2016, 4:00:02 PM7/26/16
to desarrolladores-android

Cualquier cosa pregunta nuevamente, me cito:

En el onPreExecute podrías disparar un cargador, hacer tu petición en el doInBackground, y cerrar el cargador y configurar el texto con tvData.setText(""); en el onPostExecute  ;)

Eso que dije, es así, porque si lees bien los enlaces que te pase, en el asynctask se ejecuta todo en el hilo principal menos la función doInBackground que es lo que se hace en un hilo aparte. Por eso allí debes realizar tus peticiones, y en las otras funciones podés alterar la UI


El mar., 26 jul. 2016 10:53, Frenando Garcia <frenan...@gmail.com> escribió:
Gracias, les echare un vistazo a ver si me aclaro.

--
Para participar es necesario que leas detenidamente las normas del grupo: https://goo.gl/xeTRQm
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a desarrolladores-a...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/desarrolladores-android.

Frenando Garcia

unread,
Jul 26, 2016, 6:34:56 PM7/26/16
to desarrolladores-android
Gracias por la informacion, he conseguido que funcione. Bueno, funciona mas o menos porque el archivo de texto tiene varias lineas y me lo muestra pero poniendome las lineas una detras de otra sin hacer el salto de linea. ¿puede ser a que sea un archivo txt o es que el proceso tiene algun fallo al respecto?

Gabriel Pozo

unread,
Jul 27, 2016, 8:22:04 PM7/27/16
to desarrolladores-android
En tu código si en vez de hacer:


while ((line = reader.readLine()) != null) {
buffer.append(line);
}

Haces algo así?
while ((line = reader.readLine()) != null) {
buffer.append(line);
    buffer.append("\n\r");
}

El mar., 26 jul. 2016 a las 19:34, Frenando Garcia (<frenan...@gmail.com>) escribió:
Gracias por la informacion, he conseguido que funcione. Bueno, funciona mas o menos porque el archivo de texto tiene varias lineas y me lo muestra pero poniendome las lineas una detras de otra sin hacer el salto de linea. ¿puede ser a que sea un archivo txt o es que el proceso tiene algun fallo al respecto?

--
Para participar es necesario que leas detenidamente las normas del grupo: https://goo.gl/xeTRQm
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a desarrolladores-a...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/desarrolladores-android.

Frenando Garcia

unread,
Jul 30, 2016, 10:12:30 AM7/30/16
to desarrolladores-android
Gracias Gabriel, me funciona tanto el \n\r como si solo pusiera el \n.
Reply all
Reply to author
Forward
0 new messages