Foros del Web » Programando para Internet » Android »

Asynctask no funciona en Android 4.1

Estas en el tema de Asynctask no funciona en Android 4.1 en el foro de Android en Foros del Web. Saludos, tengo mi codigo android el cual funciona bien en android 2 o 3 pero en la version 4.1 tengo unos errores, escencial mente hace ...
  #1 (permalink)  
Antiguo 31/01/2013, 09:07
 
Fecha de Ingreso: septiembre-2008
Mensajes: 257
Antigüedad: 16 años, 3 meses
Puntos: 4
Asynctask no funciona en Android 4.1

Saludos, tengo mi codigo android el cual funciona bien en android 2 o 3 pero en la version 4.1 tengo unos errores, escencial mente hace uans busquedas y devuelve los datos y los muestra en una lista ahi le hago clic para q haga otra busqueda y muestre otros datos pero ahi es cuando me da error, ingresa al asynctask y marca error...

Mi pregunta es cambia en algo el uso de asynctask desde una version anterior a la version 4.1 de android..espero su ayuda gracias de antemano..

este es el error que me da..
Código:
01-31 14:56:07.572: E/AndroidRuntime(824):  ndroid.os.NetworkOnMainThreadException
  #2 (permalink)  
Antiguo 06/02/2013, 08:48
Avatar de Leojg  
Fecha de Ingreso: marzo-2008
Ubicación: Salto Uruguay
Mensajes: 70
Antigüedad: 16 años, 9 meses
Puntos: 11
Respuesta: Asynctask no funciona en Android 4.1

Yo tengo un problema similar con un cliente de twitter que en 2.3 andaba de lujo pero en 4.0 o superior ni arrancaba D:

Al parecer desde android 4.0 no se permite llamar al navegador desde la UI(o algo así) y hay que hacerlo de forma asincrona.

Ahora el tema es ver como se implementa eso ajajaja
  #3 (permalink)  
Antiguo 06/02/2013, 16:05
 
Fecha de Ingreso: mayo-2012
Mensajes: 20
Antigüedad: 12 años, 6 meses
Puntos: 2
Respuesta: Asynctask no funciona en Android 4.1

Como bien dicen, desde Android 4.0 (creo) esas busquedas hay que hacerlas en otro hilo. No es tan dificil como creen. Basicamente se declara asi:

Código Javascript:
Ver original
  1. class llamadAsync extends AsyncTask<String, String, String>
  2. {
  3.     @Override
  4.     protected String doInBackground(String... params)
  5.     {      
  6.         //Es la ejecucion principal, los parametros se obtienen como de un array de la forma en la que se llamo -> params[0], params[1], etc..
  7.     }
  8.    
  9.     protected void onPostExecute(String result)
  10.     {
  11.         //Se ejecuta cuando termina
  12.     }


Despues, simplemente es cuestion de llamarla con el siguiente codigo:

Saludos
  #4 (permalink)  
Antiguo 06/02/2013, 16:05
 
Fecha de Ingreso: mayo-2012
Mensajes: 20
Antigüedad: 12 años, 6 meses
Puntos: 2
Respuesta: Asynctask no funciona en Android 4.1

Cita:
Iniciado por gzanitti Ver Mensaje
Como bien dicen, desde Android 4.0 (creo) esas busquedas hay que hacerlas en otro hilo. No es tan dificil como creen. Basicamente se declara asi:

Código Java:
Ver original
  1. class llamadAsync extends AsyncTask<String, String, String>
  2. {
  3.     @Override
  4.     protected String doInBackground(String... params)
  5.     {      
  6.         //Es la ejecucion principal, los parametros se obtienen como de un array de la forma en la que se llamo -> params[0], params[1], etc..
  7.     }
  8.    
  9.     protected void onPostExecute(String result)
  10.     {
  11.         //Se ejecuta cuando termina
  12.     }


Despues, simplemente es cuestion de llamarla con el siguiente codigo:
Código Java:
Ver original
  1. new llamadAsyc(this).execute(param0, param1, etc);

Saludos
  #5 (permalink)  
Antiguo 08/02/2013, 14:50
 
Fecha de Ingreso: septiembre-2008
Mensajes: 257
Antigüedad: 16 años, 3 meses
Puntos: 4
Respuesta: Asynctask no funciona en Android 4.1

yo tego hecho asi con asyctask pero no funciona nada.....ya he pasodo mucho tiempo y no logro resolver el problema..alguien sabe como hacerlo...ya estoy medio desesperado he buscado por todo lado y nada...
  #6 (permalink)  
Antiguo 08/02/2013, 15:27
Avatar de seba123neo  
Fecha de Ingreso: febrero-2007
Ubicación: Esperanza, Santa Fe
Mensajes: 1.046
Antigüedad: 17 años, 10 meses
Puntos: 19
Respuesta: Asynctask no funciona en Android 4.1

podes hacer un debug linea por linea y fiajte donde exactamente lanza el error, pone puntos de interrupcion adentro del asynctask a ver que pasa, podes poner el codigo completo del asynctask.

a mi me ha pasado tambien, tuve que cambiar el codigo de lugar, ya que operaciones con internet que antes se realizaban no se pueden hacer mas en ese lugar.

saludos.
__________________
" Todos Somos Ignorantes; lo que pasa es que no todos ignoramos las mismas cosas " - Albert Einstein
  #7 (permalink)  
Antiguo 08/02/2013, 16:12
 
Fecha de Ingreso: septiembre-2008
Mensajes: 257
Antigüedad: 16 años, 3 meses
Puntos: 4
Respuesta: Asynctask no funciona en Android 4.1

este es todo mi codigo de mi .java....ahi esta el asyctask


Código:
package com.example.taller06oct;


public class EditEmpleadosActivity extends Activity {

	TextView lblcedula;
	EditText txtNombre;
	EditText txtApellido;
	EditText txtSueldo;
	
	Button btnSave;
	Button btnDelete;

	String cedula;

	// Progress Dialog
	private ProgressDialog pDialog;

	// JSON parser class
	JSONParser jsonParser = new JSONParser();

	// single Empleado url - Reemplaza la IP de tu equipo o la direccion de tu servidor 
	// Si tu servidor es tu PC colocar IP Ej: "http://127.97.99.200/taller06oct/..", no colocar "http://localhost/taller06oct/.."
	private static final String url_detalles_empleado = "http://www.miweb.com/android/busqueda.php";
	

	// url to update Empleado - Reemplaza la IP de tu equipo o la direccion de tu servidor 
	private static final String url_actualizar_empleado = "http://www.miweb.com/android/actualizarempleado.php";
	
	// url to delete Empleado - Reemplaza la IP de tu equipo o la direccion de tu servidor 
	private static final String url_borrar_empleado = "http://www.miweb.com/android/borrarempleado.php";

	// JSON Node names
	private static final String TAG_SUCCESS = "success";
	private static final String TAG_EMPLEADOS = "empleado";
	private static final String TAG_CEDULA = "cedula";
	private static final String TAG_NOMBRE = "nombre";
	private static final String TAG_APELLIDO = "apellido";
	private static final String TAG_SUELDO = "sueldo";
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.edit_empleado);

		// save button
		btnSave = (Button) findViewById(R.id.btnSave);
		btnDelete = (Button) findViewById(R.id.btnDelete);
		Log.i("1","inicia variableso");
		// getting Empleado details from intent
		Intent i = getIntent();
		
		// getting Empleado id (pid) from intent
		cedula = i.getStringExtra(TAG_CEDULA);

		// Getting complete Empleado details in background thread
		new GetEmpleadoDetails().execute();

		// save button click event
		btnSave.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View arg0) {
				// starting background task to update Empleado
				new SaveEmpleadoDetails().execute();
			}
		});

		// Delete button click event
		btnDelete.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View arg0) {
				// deleting Empleado in background thread
				new DeleteEmpleado().execute();
			}
		});

	}

	/**
	 * Background Async Task to Get complete Empleado details
	 * */
public	class GetEmpleadoDetails extends AsyncTask<String, String, String> {
		
		/**
		 * Before starting background thread Show Progress Dialog
		 * */
		@Override
		protected void onPreExecute() {
			Log.i("1","entrando");
			super.onPreExecute();
			pDialog = new ProgressDialog(EditEmpleadosActivity.this);
			pDialog.setMessage("Loading Empleado details. Please wait...");
			pDialog.setIndeterminate(false);
			pDialog.setCancelable(true);
			pDialog.show();
		}

		/**
		 * Getting Empleado details in background thread
		 * */
		protected String doInBackground(String... params) {
		
Log.i("1","inicia segundo plano");
			// updating UI from Background Thread
			runOnUiThread(new Runnable() {
				public void run() {
					// Check for success tag
					Log.i("1","entra segundo plano");
					int success;
					try {
						// Building Parameters
						cedula="12345";
						List<NameValuePair> params = new ArrayList<NameValuePair>(); 
						Log.i("1","crea lista");
						params.add(new BasicNameValuePair("cedula", cedula));
						Log.e("1","busca empleado para cargar detalles");
						// getting Empleado details by making HTTP request
						// Note that Empleado details url will use GET request
						 JSONObject json = jsonParser.makeHttpRequest(
								url_detalles_empleado, "GET", params);
						
						Log.e("1","llama a php busqueda");
						
						// check your log for json response
						Log.d("Single Empleado Details", json.toString());
						
						// json success tag 
						success = json.getInt(TAG_SUCCESS);
						if (success == 1) {
							// successfully received Empleado details
							JSONArray EmpleadoObj = json
									.getJSONArray(TAG_EMPLEADOS); // JSON Array
							
							// get first Empleado object from JSON Array
							JSONObject Empleado = EmpleadoObj.getJSONObject(0);

							// Empleado with this pid found
							// Edit Text
							lblcedula = (TextView) findViewById(R.id.lblcedula);
							txtNombre = (EditText) findViewById(R.id.inputNombre);
							txtApellido = (EditText) findViewById(R.id.inputApellido);
							txtSueldo = (EditText) findViewById(R.id.inputSueldo);

							// display Empleado data in EditText
							lblcedula.setText(Empleado.getString(TAG_CEDULA));
							txtNombre.setText(Empleado.getString(TAG_NOMBRE));
							txtApellido.setText(Empleado.getString(TAG_APELLIDO));
							txtSueldo.setText(Empleado.getString(TAG_SUELDO));

						}else{
							// Empleado with pid not found
							Log.i("1","error en el empelado");
						}
					} catch (JSONException e) {
						e.printStackTrace();
					}
				}
			});

			return null;
		}


		/**
		 * After completing background task Dismiss the progress dialog
		 * **/
		protected void onPostExecute(String file_url) {
			// dismiss the dialog once got all details
			pDialog.dismiss();
		}
	}

	/**
	 * Background Async Task to  Save Empleado Details
	 * */
	class SaveEmpleadoDetails extends AsyncTask<String, String, String> {

		/**
		 * Before starting background thread Show Progress Dialog
		 * */
		@Override
		protected void onPreExecute() {
			super.onPreExecute();
			pDialog = new ProgressDialog(EditEmpleadosActivity.this);
			pDialog.setMessage("Actualizando Empleado ...");
			pDialog.setIndeterminate(false);
			pDialog.setCancelable(true);
			pDialog.show();
		}

		/**
		 * Saving Empleado
		 * */
		protected String doInBackground(String... args) {

			// getting updated data from EditTexts
			
			String nombre = txtNombre.getText().toString();
			String apellido = txtApellido.getText().toString();
			String sueldo = txtSueldo.getText().toString();

			// Building Parameters
			List<NameValuePair> params = new ArrayList<NameValuePair>();
			params.add(new BasicNameValuePair(TAG_CEDULA, cedula));
			params.add(new BasicNameValuePair(TAG_NOMBRE, nombre));
			params.add(new BasicNameValuePair(TAG_APELLIDO, apellido));
			params.add(new BasicNameValuePair(TAG_SUELDO, sueldo));

			// sending modified data through http request
			// Notice that update Empleado url accepts POST method
			JSONObject json = jsonParser.makeHttpRequest(url_actualizar_empleado,
					"POST", params);

			// check json success tag
			try {
				int success = json.getInt(TAG_SUCCESS);
				
				if (success == 1) {
					// successfully updated
					Intent i = getIntent();
					// send result code 100 to notify about Empleado update
					setResult(100, i);
					finish();
				} else {
					// failed to update Empleado
				}
			} catch (JSONException e) {
				e.printStackTrace();
			}

			return null;
		}


		/**
		 * After completing background task Dismiss the progress dialog
		 * **/
		protected void onPostExecute(String file_url) {
			// dismiss the dialog once Empleado uupdated
			pDialog.dismiss();
		}
	}

	/*****************************************************************
	 * Background Async Task to Delete Empleado
	 * */
	class DeleteEmpleado extends AsyncTask<String, String, String> {

		/**
		 * Before starting background thread Show Progress Dialog
		 * */
		@Override
		protected void onPreExecute() {
			super.onPreExecute();
			pDialog = new ProgressDialog(EditEmpleadosActivity.this);
			pDialog.setMessage("Borrando Empleado...");
			pDialog.setIndeterminate(false);
			pDialog.setCancelable(true);
			pDialog.show();
		}

		/**
		 * Deleting Empleado
		 * */
		protected String doInBackground(String... args) {

			// Check for success tag
			int success;
			try {
				// Building Parameters
				List<NameValuePair> params = new ArrayList<NameValuePair>();
				params.add(new BasicNameValuePair("cedula", cedula));

				// getting Empleado details by making HTTP request
				JSONObject json = jsonParser.makeHttpRequest(
						url_borrar_empleado, "POST", params);

				// check your log for json response
				Log.d("Borrando Empleado", json.toString());
				
				// json success tag
				success = json.getInt(TAG_SUCCESS);
				if (success == 1) {
					// Empleado successfully deleted
					// notify previous activity by sending code 100
					Intent i = getIntent();
					// send result code 100 to notify about Empleado deletion
					setResult(100, i);
					finish();
				}
			} catch (JSONException e) {
				e.printStackTrace();
			}

			return null;
		}

		/**
		 * After completing background task Dismiss the progress dialog
		 * **/
		protected void onPostExecute(String file_url) {
			// dismiss the dialog once Empleado deleted
			pDialog.dismiss();

		}

	}
}

en la parte donde me da error es justo cuando llega a JSONObjetc..llega a esta linea y me da error....
Código:
JSONObject json = jsonParser.makeHttpRequest(
								url_detalles_empleado, "GET", params);
  #8 (permalink)  
Antiguo 08/02/2013, 16:20
Avatar de seba123neo  
Fecha de Ingreso: febrero-2007
Ubicación: Esperanza, Santa Fe
Mensajes: 1.046
Antigüedad: 17 años, 10 meses
Puntos: 19
Respuesta: Asynctask no funciona en Android 4.1

lo que veo mal es ese runOnUiThread(new Runnable() {, fijate que los otors asynctask no lo tienen, aparte yo uso mucho el asynctask y nunca he usado eso dentro del doInBackGround ya qeu no es necesario, proba sacarlo.

saludos.
__________________
" Todos Somos Ignorantes; lo que pasa es que no todos ignoramos las mismas cosas " - Albert Einstein
  #9 (permalink)  
Antiguo 08/02/2013, 17:02
 
Fecha de Ingreso: septiembre-2008
Mensajes: 257
Antigüedad: 16 años, 3 meses
Puntos: 4
Respuesta: Asynctask no funciona en Android 4.1

Yo lo quite pero al quitarlo el codigo me marca error... como deberia dejar el codigo para q no m ponga error...

el error me da aqui:

public void run() {

este es el mensaje de error:
Syntax error on token(s), misplaced construct(s)

tambien me da error aqui:

List<NameValuePair> params = new ArrayList<NameValuePair>();

en "params" y el mesanje de error dice;

"Duplicate local variable params"

Última edición por sheshito; 08/02/2013 a las 17:09

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:41.