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 :
le code de BackgroundTask :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 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(); } } }
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99 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(); } } }
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Merci d'avance pour votre votre aide![]()
Partager