|
Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android |
|
Herramientas |
#21
|
||||
|
||||
Buenas, estoy desarrollando una aplicacion android donde primeramente se comprueba con un login si el usuario esta registrado en la db, y despues se comprueba las rutinas que tiene asignadas. Inicialmente lo hice con dos proyectos independientes, y funcionan perfectamente, pero al unirlos (priomero el login y despues la consulta), me da una serie de errores de los que desconozco su causa.
El login lo hace correctamente (las 4 primeras lineas del log), pero despues falla en cosultar las rutinas : 05-17 09:37:28.855: E/getpostresponse(1171): result= [{"logstatus":"1"}] 05-17 09:37:29.872: E/loginstatus(1171): logstatus= 1 05-17 09:37:29.872: E/loginstatus(1171): valido 05-17 09:37:29.876: E/onPostExecute=(1171): ok 05-17 09:52:03.297: E/AndroidRuntime(1457): FATAL EXCEPTION: main 05-17 09:52:03.297: E/AndroidRuntime(1457): java.lang.RuntimeException: Unable to instantiate application android.app.Application: java.lang.NullPointerException 05-17 09:52:03.297: E/AndroidRuntime(1457): at android.app.LoadedApk.makeApplication(LoadedApk.ja va:504) 05-17 09:52:03.297: E/AndroidRuntime(1457): at android.app.ActivityThread.handleBindApplication(A ctivityThread.java:4364) 05-17 09:52:03.297: E/AndroidRuntime(1457): at android.app.ActivityThread.access$1300(ActivityThr ead.java:141) 05-17 09:52:03.297: E/AndroidRuntime(1457): at android.app.ActivityThread$H.handleMessage(Activit yThread.java:1294) 05-17 09:52:03.297: E/AndroidRuntime(1457): at android.os.Handler.dispatchMessage(Handler.java:99 ) 05-17 09:52:03.297: E/AndroidRuntime(1457): at android.os.Looper.loop(Looper.java:137) 05-17 09:52:03.297: E/AndroidRuntime(1457): at android.app.ActivityThread.main(ActivityThread.jav a:5041) 05-17 09:52:03.297: E/AndroidRuntime(1457): at java.lang.reflect.Method.invokeNative(Native Method) 05-17 09:52:03.297: E/AndroidRuntime(1457): at java.lang.reflect.Method.invoke(Method.java:511) 05-17 09:52:03.297: E/AndroidRuntime(1457): at com.android.internal.os.ZygoteInit$MethodAndArgsCa ller.run(ZygoteInit.java:793) 05-17 09:52:03.297: E/AndroidRuntime(1457): at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:560) Alguien sabe a que puede ser debido? que hago mal? os pongo el codigo package test.Droidlogin; import java.util.ArrayList; import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import test.Droidlogin.library.Httppostaux; import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.os.SystemClock; import android.os.Vibrator; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; HiScreen y login estan en el paquete testdroidlogin Httppostaux esta en un paquete aparte. ( es la clase que utilizo para hacer las consultas) public class Login extends Activity { EditText user; EditText pass; Button blogin; TextView registrar; Httppostaux post; // String URL_connect="http://www.scandroidtest.site90.com/acces.php"; String IP_Server="10.0.2.2";//IP DE NUESTRO PC 192.168.1.10 String URL_connect="http://"+IP_Server+"/droidlogin2/acces.php";//ruta en donde estan nuestros archivos boolean result_back; private ProgressDialog pDialog; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); post=new Httppostaux(); user= (EditText) findViewById(R.id.edusuario); pass= (EditText) findViewById(R.id.edpassword); blogin= (Button) findViewById(R.id.Blogin); // registrar=(TextView) findViewById(R.id.link_to_register); //Login button action blogin.setOnClickListener(new View.OnClickListener(){ public void onClick(View view){ //Extreamos datos de los EditText String usuario=user.getText().toString(); String passw=pass.getText().toString(); //verificamos si estan en blanco if( checklogindata( usuario , passw )==true){ //si pasamos esa validacion ejecutamos el asynctask pasando el usuario y clave como parametros new asynclogin().execute(usuario,passw); }else{ //si detecto un error en la primera validacion vibrar y mostrar un Toast con un mensaje de error. err_login(); } } }); // registrar.setOnClickListener(new View.OnClickListener(){ // // public void onClick(View view){ // // //Abre el navegador al formulario adduser.html // String url = "http://"+IP_Server+"/droidlogin/adduser.html"; // Intent i = new Intent(Intent.ACTION_VIEW); // i.setData(Uri.parse(url)); // startActivity(i); // } // }); } //vibra y muestra un Toast public void err_login(){ Vibrator vibrator =(Vibrator) getSystemService(Context.VIBRATOR_SERVICE); vibrator.vibrate(200); Toast toast1 = Toast.makeText(getApplicationContext(),"Error:Nomb re de usuario o password incorrectos", Toast.LENGTH_SHORT); toast1.show(); } /*Valida el estado del logueo solamente necesita como parametros el usuario y passw* public boolean loginstatus(String username ,String password ) { int logstatus=-1; /*Creamos un ArrayList del tipo nombre valor para agregar los datos recibidos por los parametros anteriores * y enviarlo mediante POST a nuestro sistema para relizar la validacion*/ ArrayList<NameValuePair> postparameters2send= new ArrayList<NameValuePair>(); postparameters2send.add(new BasicNameValuePair("usuario",username));//usuario postparameters2send.add(new BasicNameValuePair("password",password));//password //realizamos una peticion y como respuesta obtenes un array JSON JSONArray jdata=post.getserverdata(postparameters2send, URL_connect); /*como estamos trabajando de manera local el ida y vuelta sera casi inmediato * para darle un poco realismo decimos que el proceso se pare por unos segundos para poder * observar el progressdialog * la podemos eliminar si queremos * SystemClock.sleep(950); //si lo que obtuvimos no es null if (jdata!=null && jdata.length() > 0){ JSONObject json_data; //creamos un objeto JSON try { json_data = jdata.getJSONObject(0); //leemos el primer segmento, en nuestro caso el unico logstatus=json_data.getInt("logstatus");//accedemos al valor Log.e("loginstatus","logstatus= "+logstatus);//muestro por log que obtuvimos } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } //validamos el valor obtenido if (logstatus==0){// [{"logstatus":"0"}] Log.e("loginstatus ", "invalido"); return false; } else{// [{"logstatus":"1"}] Log.e("loginstatus ", "valido"); return true; } }else{ //json obtenido invalido verificar parte WEB. Log.e("JSON ", "ERROR"); return false; } } //validamos si no hay ningun campo en blanco public boolean checklogindata(String username ,String password ){ if (username.equals("") || password.equals("")){ Log.e("Login ui", "checklogindata user or pass error"); return false; }else{ return true; } } /* CLASE ASYNCTASK * * usaremos esta para poder mostrar el dialogo de progreso mientras enviamos y obtenemos los datos * podria hacerse lo mismo sin usar esto pero si el tiempo de respuesta es demasiado lo que podria ocurrir * si la conexion es lenta o el servidor tarda en responder la aplicacion sera inestable. * ademas observariamos el mensaje de que la app no responde. * class asynclogin extends AsyncTask< String, String, String > { String user,pass; protected void onPreExecute() { //para el progress dialog pDialog = new ProgressDialog(Login.this); pDialog.setMessage("Autenticando...."); pDialog.setIndeterminate(false); pDialog.setCancelable(false); pDialog.show(); } protected String doInBackground(String[]params) { //obtnemos usr y pass user=params[0]; pass=params[1]; //enviamos y recibimos y analizamos los datos en segundo plano. if (loginstatus(user,pass)==true){ return "ok"; //login valido }else{ return "err"; //login invalido } } /*Una vez terminado doInBackground segun lo que halla ocurrido pasamos a la sig. activity o mostramos error* protected void onPostExecute(String result) { pDialog.dismiss();//ocultamos progess dialog. Log.e("onPostExecute=",""+result); if (result.equals("ok")){ Intent i=new Intent(Login.this, HiScreen.class); i.putExtra("user",user); startActivity(i); }else{ err_login(); } } } } public class HiScreen extends Activity { String user; TextView txt_usr; Button atras; String IP_Server="10.0.2.2";//IP DE NUESTRO PC 192.168.1.10 String URL_connect="http://"+IP_Server+"/consultarutinasusuario/prueba.php"; private ProgressDialog pDialog; Httppostaux post; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.lay_screen); txt_usr= (TextView) findViewById(R.id.usr_name); atras= (Button) findViewById(R.id.atras); Bundle extras = getIntent().getExtras(); //Obtenemos datos enviados en el intent. if (extras != null) { user = extras.getString("user");//usuario }else{ user="error"; } txt_usr.setText(user);//cambiamos texto al nombre del usuario logueado atras.setOnClickListener(new View.OnClickListener(){ public void onClick(View view){ new asyncRutina().execute("2"); } }); } public void comprueba(String id_usuario) { int id__usuario; int id_rutina; int [] rutinas; /*Creamos un ArrayList del tipo nombre valor para agregar los datos recibidos por los parametros anteriores * y enviarlo mediante POST a nuestro sistema para relizar la validacion*/ ArrayList<NameValuePair> postparameters2send= new ArrayList<NameValuePair>(); postparameters2send.add(new BasicNameValuePair("id_usuario",id_usuario));//usuario //realizamos una peticion y como respuesta obtenes un array JSON JSONArray jdata=post.getserverdata(postparameters2send, URL_connect); Log.e("El resultado devuelto en login->","JSONArray ="+jdata); rutinas = new int[jdata.length()]; if (jdata!=null && jdata.length() > 0 ){ Log.e("despues del if","hasta aqui llega"); JSONObject json_data; //creamos un objeto JSON Log.e("despues crear el objeto JSON","hasta aqui llega"); try { Log.e("Entramos en el try","hasta aqui llega"); for(int i=0;i<jdata.length();i++){ json_data = jdata.getJSONObject(i); rutinas[i]=json_data.getInt("Id_Rutina"); Log.e("Id rutina"+(i+1),""+rutinas[i]); id__usuario=json_data.getInt("Id_Usuario"); //Log.e("Id Usuario",""+id__usuario); } } catch (JSONException e) { e.printStackTrace(); } }else{ //json obtenido invalido verificar parte WEB. Log.e("JSON ", "ERROR"); } } class asyncRutina extends AsyncTask< String, String, String > { String user; protected void onPreExecute() { //para el progress dialog pDialog = new ProgressDialog(HiScreen.this); pDialog.setMessage("Consultando Rutinas..."); pDialog.setIndeterminate(false); pDialog.setCancelable(false); pDialog.show(); } protected String doInBackground(String[]params) { //obtnemos usr y pass user=params[0]; comprueba(user); return user; //enviamos y recibimos y analizamos los datos en segundo plano. } protected void onPostExecute(String user) { pDialog.dismiss();//ocultamos progess dialog. Log.e("Mostradas las rutinas del usuario:",""+user); } } } 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 in http connection "+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 converting result "+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; } } } Esas son las tres clases. Alguien puede ayudarme? estoy muy estancado!!!! Gracias!! |
|
#22
|
||||
|
||||
Pasale el depurador, paso a paso... es que sino va ser complicado pillar el error.
Ese error suele darlo cuando se intenta guardar un dato de tistinto tipo en el una variable o se le asigna una acción con un valor null o sin "inflar" la variable. Pon el depurador paso a paso y mira donde rompe. Dimos en que linea rompe y a ver si lo pillamos.
__________________
|
#23
|
||||
|
||||
Rompe cuando en la segunda activity, HiScreen va a hacer la segunda consulta. No entiendo el porque, si lo hago por separado en dos proyectos se ejecutan perfectamente, ahora si los pongo juntos, es decir primero el login y despues la consulta de las rutinas me da el fallo en la consulta. Rompe concretamente cuando va a hacer la segunda consulta, ya que la segunda activity se muestra, pero cuando pulso el boton para hacer la consulta falla! y hace la conlta de la misma forma que el login , y me tiene amargadisimo!!!
Gracias!!!!! |
#24
|
||||
|
||||
Rompe cuando en la segunda activity, HiScreen va a hacer la segunda consulta. No entiendo el porque, si lo hago por separado en dos proyectos se ejecutan perfectamente, ahora si los pongo juntos, es decir primero el login y despues la consulta de las rutinas me da el fallo en la consulta. Rompe concretamente cuando va a hacer la segunda consulta, ya que la segunda activity se muestra, pero cuando pulso el boton para hacer la consulta falla! y hace la conlta de la misma forma que el login , y me tiene amargadisimo!!!
Gracias!!!!! Espero haberte ayudado. |
#25
|
||||
|
||||
Por cierto, nos estamos yendo un poco offtopic.
La solución a mi hilo es el siguiente: recomiendo crear un WebService para atacar cualquier base de datos, ahí encontré mi solución. La propuesta particular mía es usar Java con la librería Jersey para servicios web (JAX-SX creo), usando particularidades de google como GSON (gozada). Un saludo. |
#26
|
||||
|
||||
No he mirado mucho tu código, pero profesionalmente me parece una chapuza :p. Para empezar, deberías parsear los JSON en una clase diferente. Por otra parte, cada consulta a la base de datos debería de estar dentro de un hilo, esto es, dentro de una AsyncTask (sino va a cascar justo en el instante).
Espero haberte ayudado. (desde asyntask llamo a la funcion loginstatus(en login) y comprueba ( en HiScreen) ahi es donde se realiza la consulta, ) Si sabeis una posible solucion me ayudariais mucho!! Gracias!! |
#27
|
||||
|
||||
uff te ayudaría pero ahora estoy estudiando. Por cierto, yo llevo en Android desde enero, pero es tema de saber programar o no, en el sentido amplio
|
#28
|
||||
|
||||
Pues cuando puedas te agradeceria que me echaras una mano!!! de momento estoy intentando ver cual es el problema con el debuguer, a ver si consigo dar con el. Gracias! |
#29
|
||||
|
||||
Nada no hay manera. Si me funcionan las dos partes como proyectos independientes, porque falla cuando las pongo una tras otra? Arggggggggg me tiene un tanto amargado.
|
#30
|
||||
|
||||
A mi lo que me gustaria saber es porque la segunda consulta a base de datos mysql de mis proyectos android SIEMPRE dan error. Ahi es donde esta el problema. He probado con asyntask, sin asyntask, y con hlos. Si hago las consultas en dos proyectos independientes lo hace perfectamente, si las pongo una tras otra, no.
|
#31
|
||||
|
||||
Lo que sí tienes que hacer es con AsyncTask. AsyncTask es una clase que te crea un hilo independiente para la ejecución de una serie de sentencias. Es recomendable que uses esta clase para hacer uso de hilos, aunque también puedes gestionarlos por tu cuenta.
|
#32
|
||||
|
||||
Lo que sí tienes que hacer es con AsyncTask. AsyncTask es una clase que te crea un hilo independiente para la ejecución de una serie de sentencias. Es recomendable que uses esta clase para hacer uso de hilos, aunque también puedes gestionarlos por tu cuenta.
Si te fijas en el codigo, utilizo esa clase para ejecutar las consultas. |
#33
|
||||
|
||||
Ya sé donde tienes el fallo.
No puedes cambiar de Activity cuando estás dentro de un AsyncTask. Tienes que hacerlo fuera, tras terminar la ejecución dle hilo y, por supuesto, tras el execute(). Me imagino que será por eso eh. |
#34
|
||||
|
||||
De hecho, cuando abres un nuevo hilo se hace algo así como un cambio de contexto, por lo que en el hilo no se sabe de la existencia de algo de donde ha sido llamado/ejecutado, y por lo tanto, no sabe que estabas en una Activity antes de ejecutarlo.
|
#35
|
||||
|
||||
No es por eso, ademas, en el postexecute ya estas en el hilo principal, unicamente pasas al secundario en el doinbackground. Ya se cual era el fallo, no podia ejecutar dos peticiones con las mismas variables de httpclient , httppost y todas las que estan dentro de la clase httppostaux, ahi era donde se producia el fallo y por lo tanto nunca me dejaba ejecutar la segunda consulta. He creado otra clase con la misma configuracion que esta y cambiandole los nombre a las variables y ya me funciona Muchas gracias por la ayuda!!! |
#36
|
||||
|
||||
Ayuda
Podrías mostrarme el código para solucionar este problema, yo tengo el mismo y no paso de ahi
|
Estás aquí | ||||||
|