Bug accès base de données java android

Fermé
noidcoco Messages postés 7 Date d'inscription lundi 12 septembre 2016 Statut Membre Dernière intervention 13 septembre 2016 - Modifié par BunoCS le 12/09/2016 à 10:40
noidcoco Messages postés 7 Date d'inscription lundi 12 septembre 2016 Statut Membre Dernière intervention 13 septembre 2016 - 13 sept. 2016 à 15:07
Bonjour, lorsque j'essai de me connecter à une base de données sur android studio, j'obtiens un bug, l'appli crash et j'obtiens ceci dans les logs sur android studio :

09-11 19:07:46.240 2008-2797/chamoux.annonces E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:299)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
at java.util.concurrent.FutureTask.run(FutureTask.java:239)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:856)
Caused by: java.lang.NullPointerException: lock == null
at java.io.Reader.<init>(Reader.java:64)
at java.io.InputStreamReader.<init>(InputStreamReader.java:79)
at chamoux.annonces.BackgroundTask.doInBackground(BackgroundTask.java:68)
at chamoux.annonces.BackgroundTask.doInBackground(BackgroundTask.java:28)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask.run(FutureTask.java:234)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:856)


concernant le code, voici le code de la classe lié à ma page XML :

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.support.annotation.Nullable;
 
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
 
 
 
public class ConnexionActivity extends Activity {
 
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.connexion);
 
        Button myButton = (Button) findViewById(R.id.button6);
        Button myButton2 = (Button) findViewById(R.id.button15);
 
 
        myButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                Intent myIntent = new Intent(ConnexionActivity.this, MainActivity.class);
                startActivity(myIntent);
            }
        }
 
        );
 
 
    }
 
     
    // la fonction appelé par mon bouton
    public void userLog(View view){
 
        ConnectivityManager connMgr = (ConnectivityManager)
        getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
        if (networkInfo != null && networkInfo.isConnected()) {
 
            EditText mye = (EditText) findViewById(R.id.editText2);
            EditText mye2 = (EditText) findViewById(R.id.editText3);
 
            String pseud = mye.getText().toString();
            String mdp = mye2.getText().toString();
            String method = "login";
             
            //appel de ma fonction en asynctask qui fait planter
            BackgroundTask backgroundTask = new BackgroundTask(this);
            backgroundTask.execute(method,pseud,mdp);
        }
        else
        {
            //message flottant
            Toast.makeText(getBaseContext(),"non connecté",Toast.LENGTH_SHORT).show();
        }
    }
 
 
 
}


le code de BackgroundTask :

import android.content.Context;
import android.os.AsyncTask;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.widget.Toast;
 
 
public class BackgroundTask extends AsyncTask<String, Void, String> {
 
    AlertDialog al;
    Context ctx;
    BackgroundTask(Context ctx)
    {
        this.ctx = ctx;
    }
 
    @Override
    protected void onPreExecute()
    {
        al = new AlertDialog.Builder(ctx).create();
        al.setTitle("Erreur connexion");
    }
 
    @Override
    protected String doInBackground(String... params) {
        String method = params[0];
        String log_url = "liendemapage";
 
        if(method.equals("login"))
        {
            String pseud = params[1];
            String mdp = params[2];
 
            try {
                URL url = new URL(log_url);
                HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                httpURLConnection.setRequestMethod("POST");
                httpURLConnection.setDoOutput(true);
                httpURLConnection.setDoInput(true);
                OutputStream OS = httpURLConnection.getOutputStream();
                BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(OS,"UTF-8"));
                String data = URLEncoder.encode("user","UTF-8") + "=" + URLEncoder.encode(pseud,"UTF-8") + "&" + URLEncoder.encode("mdp","UTF-8") + "=" + URLEncoder.encode(mdp,"UTF-8");
                bufferedWriter.write(data);
                bufferedWriter.flush();
                bufferedWriter.close();
                OS.close();
                InputStream IS = httpURLConnection.getErrorStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(IS,"iso-8859-1"));
                String rep = "";
                String line =  "";
 
                while((line = bufferedReader.readLine())!=null)
                {
                    rep += line;
                }
 
                bufferedReader.close();
                IS.close();
                httpURLConnection.disconnect();
 
            } catch (IOException e) {
                e.printStackTrace();
            }
 
        }
 
        return null;
    }
 
    @Override
    protected void onProgressUpdate(Void... values) {
        super.onProgressUpdate(values);
    }
 
    @Override
    protected void onPostExecute(String result) {
        if(result.equals("non"))
        {
            al.setMessage("Mail ou mot de passe incorrect");
            al.show();
        }
    }
}


mon activité BackgroundTask n'est pas référencé dans le manifeste (je pense que c'est normal), par contre, l'autorisation de connexion est activé dedans :


<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />


petite info si je met un mauvais URL, cela ne fait plus crash l'appli mais elle m'affiche un message vide dans l'alerte. Par contre si je met le bon lien, même si le fichier php est vide.

Merci d'avance pour votre votre aide :)
EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ICI

Merci d'y penser dans tes prochains messages.
A voir également:

8 réponses

BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 894
12 sept. 2016 à 10:55
Hello,

Tout d'abord, j'ai édité ton message pour gagner en lisibilité. Merci de prendre connaissance du cartouche en fin de message.
Ensuite, le log te dit que tu as une NullPointerException à la ligne 68 de ta BackgroundTask. En regardant de plus près, tu as branché IS sur
getErrorStream()
. C'est voulu? Il n'y a pas tout le temps d'erreur... Donc soit tu t'es trompé de stream, soit tu dois vérifier qu'il n'est pas null...
0
noidcoco Messages postés 7 Date d'inscription lundi 12 septembre 2016 Statut Membre Dernière intervention 13 septembre 2016
12 sept. 2016 à 12:39
Merci bien, pour ton aide :)
Le code arrive à se connecter mais le code php ne reçoit pas mes valeurs.
pour le teste mon code php ressemble à ceci :
<?php
echo $_POST["mdp"];
?>


Mais cela ne m'affiche rien dans mon onPostExecute qui ressemble à ceci maintenant :

@Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);

        Toast.makeText(ctx,result,Toast.LENGTH_SHORT).show();
    }


Une idée ?
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 894
12 sept. 2016 à 14:18
Hum...je ne fonctionne pas comme cela...
Je fais plutôt un truc du genre pour passer du contenu POST
List<NameValuePair> postParameters = new ArrayList<NameValuePair>();
postParameters.add(new BasicNameValuePair("user", user));
postParameters.add(new BasicNameValuePair("mdp", mdp));
httppost.setEntity(new UrlEncodedFormEntity(postParameters));

0
noidcoco Messages postés 7 Date d'inscription lundi 12 septembre 2016 Statut Membre Dernière intervention 13 septembre 2016
12 sept. 2016 à 14:42
J'ai pas mal vue de NameValuePair, le problème avec ceci est qu'il faudrait apparemment utiliser une Librairie et qu'elle est fortement déconseillé par android (ainsi que tous les forums que j'ai pu voir) car obsolète et générant trop de problèmes
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 894
Modifié par BunoCS le 12/09/2016 à 15:51
Ah oui, c'est vrai.
Du coup, j'ai trouvé ça:
Uri.Builder builder = new Uri.Builder()
        .appendQueryParameter("user", user)
        .appendQueryParameter("mdp", mdp);
String query = builder.build().getEncodedQuery();

OutputStream os = httpUrlConnection.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
writer.write(query);
writer.flush();
writer.close();
os.close(); 


@+ 
Buno, Modo CS-CCM 
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai... 
The urgent is done, the impossible is underway. For miracles, provide for a delay...
0
noidcoco Messages postés 7 Date d'inscription lundi 12 septembre 2016 Statut Membre Dernière intervention 13 septembre 2016
12 sept. 2016 à 17:09
Ce code ne fait rien passer en POST non plus
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 894
12 sept. 2016 à 17:17
httpURLConnection.connect();

au lieu de
httpURLConnection.disconnect();

non?
0
noidcoco Messages postés 7 Date d'inscription lundi 12 septembre 2016 Statut Membre Dernière intervention 13 septembre 2016
12 sept. 2016 à 17:44
non à la fin de l'execution tu te déconnecte
0
noidcoco Messages postés 7 Date d'inscription lundi 12 septembre 2016 Statut Membre Dernière intervention 13 septembre 2016
13 sept. 2016 à 11:06
Personne ne sais d'où vient mon problème ? ^^
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 894
13 sept. 2016 à 11:09
Tu as quelque chose côté PHP?
Une erreur dans le logcat?
0
noidcoco Messages postés 7 Date d'inscription lundi 12 septembre 2016 Statut Membre Dernière intervention 13 septembre 2016
13 sept. 2016 à 15:07
je ne reçoit pas les variables post et je n'ai aucune erreur
0