Autore Topic: Gestione messaggio di errore  (Letto 545 volte)

Offline sepand

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
Gestione messaggio di errore
« il: 27 Maggio 2014, 08:38:46 CEST »
0
Ciao a tutti.
Nel seguente codice, se il tentativo di connessione va in timeout, l'applicazione va in crash.
Qualcuno può darmi una mano nel gestire un messaggio di errore a video del tipo "Connessione non riuscita"?

Codice: [Seleziona]
public class TaskLogin extends AsyncTask<String, Void, String[]> {
        String[] risultatoLogin = new String [4];
        ProgressDialog pd;
        Context context;
       
        public TaskLogin (Context _context){
                this.context = _context;
        }
       
        @Override
        protected void onPreExecute() {
                pd = new ProgressDialog(context);
                pd.setTitle("Login in corso!");
                pd.setMessage("Attendere...");
                pd.setCancelable(false);
                pd.setIndeterminate(true);
                pd.show();
        }
       
        @Override
        protected String[] doInBackground(String... params) {
                String url = "http://mioindirizzo/login.php";
               
                JSONParser sitoLogin = new JSONParser();
                try{
                        JSONObject obj = sitoLogin.getJSONFromUrl(url, params);
                        risultatoLogin[0] = obj.getString("id");
                        risultatoLogin[1] = obj.getString("name");
                       
                        return risultatoLogin;
                }
                catch (Exception e){
                       
                }
                return null;
        }
       
        @Override
        protected void onPostExecute(String[] result) {
                if (pd.isShowing()) {
            pd.dismiss();
        }
        }
}

Codice: [Seleziona]
    public JSONObject getJSONFromUrl(String url, String[] parametri) {
 
        // Preparo i dati da passare tramite POST
            ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("usr", parametri[0]));
            params.add(new BasicNameValuePair("psw", parametri[1]));
            // HTTP request
            Log.i("User", parametri[0]);
            Log.i("Password", parametri[1]);
        try {
            HttpParams httpParams = new BasicHttpParams();
            //timeout per la connessione
            int connectionTimeout = 10000; //10 secondi
            HttpConnectionParams.setConnectionTimeout(httpParams,connectionTimeout);
            //timeout per i dati
            int dataTimeout = 20000; //20 secondi
            HttpConnectionParams.setSoTimeout(httpParams, dataTimeout);
               
            DefaultHttpClient httpClient = new DefaultHttpClient(httpParams);
            HttpPost httppost = new HttpPost(url);
            httppost.setEntity(new UrlEncodedFormEntity(params));
 
            HttpResponse httpResponse = httpClient.execute(httppost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();
 
        } catch (ConnectTimeoutException e) {
                //??????????????
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(is), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
            is.close();
            json = sb.toString();
            Log.e("JSON", json);
        } catch (Exception e) {
            Log.e("Buffer Error", "Errore nella conversione " + e.toString());
        }
 
        //trasformo la stringa in un oggetto JSON
        //se abbiamo fatto errori lato server, qui vengono fuori ;)
        try {
            jObj = new JSONObject(json);           
        } catch (JSONException e) {
            Log.e("JSON Parser", "Errore nel parse " + e.toString());
        }
 
        // return l'oggetto JSONObject
        return jObj;
 
    }
}

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Gestione messaggio di errore
« Risposta #1 il: 27 Maggio 2014, 09:38:23 CEST »
0
Puoi postare il LogCat del crash?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline sepand

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
Re:Gestione messaggio di errore
« Risposta #2 il: 27 Maggio 2014, 09:54:58 CEST »
0
Eccola qua:

Codice: [Seleziona]
05-27 03:49:22.161: I/Choreographer(1135): Skipped 57 frames!  The application may be doing too much work on its main thread.
05-27 03:49:22.661: D/dalvikvm(1135): GC_FOR_ALLOC freed 178K, 8% free 2969K/3224K, paused 49ms, total 64ms
05-27 03:49:33.001: W/System.err(1135): org.apache.http.conn.ConnectTimeoutException: Connect to /192.168.0.180:80 timed out
05-27 03:49:33.011: W/System.err(1135):         at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:121)
05-27 03:49:33.011: W/System.err(1135):         at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
05-27 03:49:33.021: W/System.err(1135):         at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
05-27 03:49:33.021: W/System.err(1135):         at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
05-27 03:49:33.031: W/System.err(1135):         at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
05-27 03:49:33.031: W/System.err(1135):         at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
05-27 03:49:33.031: W/System.err(1135):         at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
05-27 03:49:33.031: W/System.err(1135):         at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
05-27 03:49:33.031: W/System.err(1135):         at pes.cronotermo.library.JSONParser.getJSONFromUrl(JSONParser.java:75)
05-27 03:49:33.041: W/System.err(1135):         at pes.cronotermo.task.TaskLogin.doInBackground(TaskLogin.java:40)
05-27 03:49:33.041: W/System.err(1135):         at pes.cronotermo.task.TaskLogin.doInBackground(TaskLogin.java:1)
05-27 03:49:33.051: W/System.err(1135):         at android.os.AsyncTask$2.call(AsyncTask.java:288)
05-27 03:49:33.051: W/System.err(1135):         at java.util.concurrent.FutureTask.run(FutureTask.java:237)
05-27 03:49:33.051: W/System.err(1135):         at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
05-27 03:49:33.051: W/System.err(1135):         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
05-27 03:49:33.061: W/System.err(1135):         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
05-27 03:49:33.061: W/System.err(1135):         at java.lang.Thread.run(Thread.java:841)
05-27 03:49:33.071: E/Buffer Error(1135): Errore nella conversione java.lang.NullPointerException: lock == null
05-27 03:49:33.071: E/JSON Parser(1135): Errore nel parse org.json.JSONException: End of input at character 0 of
05-27 03:49:33.081: D/AndroidRuntime(1135): Shutting down VM
05-27 03:49:33.081: W/dalvikvm(1135): threadid=1: thread exiting with uncaught exception (group=0xb2ae1ba8)
05-27 03:49:33.101: E/AndroidRuntime(1135): FATAL EXCEPTION: main
05-27 03:49:33.101: E/AndroidRuntime(1135): Process: pes.cronotermo, PID: 1135
05-27 03:49:33.101: E/AndroidRuntime(1135): java.lang.NullPointerException
05-27 03:49:33.101: E/AndroidRuntime(1135):         at pes.cronotermo.LoginActivity.onClick(LoginActivity.java:118)
05-27 03:49:33.101: E/AndroidRuntime(1135):         at android.view.View.performClick(View.java:4438)
05-27 03:49:33.101: E/AndroidRuntime(1135):         at android.view.View$PerformClick.run(View.java:18422)
05-27 03:49:33.101: E/AndroidRuntime(1135):         at android.os.Handler.handleCallback(Handler.java:733)
05-27 03:49:33.101: E/AndroidRuntime(1135):         at android.os.Handler.dispatchMessage(Handler.java:95)
05-27 03:49:33.101: E/AndroidRuntime(1135):         at android.os.Looper.loop(Looper.java:136)
05-27 03:49:33.101: E/AndroidRuntime(1135):         at android.app.ActivityThread.main(ActivityThread.java:5017)
05-27 03:49:33.101: E/AndroidRuntime(1135):         at java.lang.reflect.Method.invokeNative(Native Method)
05-27 03:49:33.101: E/AndroidRuntime(1135):         at java.lang.reflect.Method.invoke(Method.java:515)
05-27 03:49:33.101: E/AndroidRuntime(1135):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
05-27 03:49:33.101: E/AndroidRuntime(1135):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
05-27 03:49:33.101: E/AndroidRuntime(1135):         at dalvik.system.NativeStart.main(Native Method)

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Gestione messaggio di errore
« Risposta #3 il: 27 Maggio 2014, 10:20:15 CEST »
0
Credo che il problema sia questo: esegui il parse del JSON anche se la connessione non è andata a buon fine. Quindi o metti anche il parse del json dentro il try-catch della connessione, oppure eviti eplicitamente di fare il parse in caso di eccezione sulla connessione.

Ancora meglio, fossi in te userei una libreria per la connessione http.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline sepand

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
Re:Gestione messaggio di errore
« Risposta #4 il: 27 Maggio 2014, 10:48:01 CEST »
0
oppure eviti eplicitamente di fare il parse in caso di eccezione sulla connessione.

E' proprio quello che vorrei fare: mostrare un messaggio all'utente e intorrompere il parse.
Il problema è che non so come fare e per questo chiedo aiuto.