Autore Topic: Problema AsyncTask  (Letto 773 volte)

Offline felasandroid

  • Utente normale
  • ***
  • Post: 345
  • Respect: +10
    • Github
    • balduzziantonio
    • balduzziantonio.unifi
    • Mostra profilo
  • Dispositivo Android:
    Huawei P8 Lite
  • Play Store ID:
    FelasTech
  • Sistema operativo:
    Windows 10
Problema AsyncTask
« il: 28 Aprile 2013, 11:05:42 CEST »
0
Nella mia app, sto eseguendo un Post per prendere dati dalla pagina HTML, uso una classe AsyncTask, solo che se vado in Debug va tutto liscio e funziona se invece eseguo normalmente l app mi dà errore., non capisco come mai.

Posto il codice della classe AsyncTask o non serve?

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:Problema AsyncTask
« Risposta #1 il: 28 Aprile 2013, 11:07:38 CEST »
0
Direi di si.
Posta codice e logcat.
Postate il LogCat LogCat LogCat LogCat LogCat

Offline felasandroid

  • Utente normale
  • ***
  • Post: 345
  • Respect: +10
    • Github
    • balduzziantonio
    • balduzziantonio.unifi
    • Mostra profilo
  • Dispositivo Android:
    Huawei P8 Lite
  • Play Store ID:
    FelasTech
  • Sistema operativo:
    Windows 10
Re:Problema AsyncTask
« Risposta #2 il: 28 Aprile 2013, 11:17:39 CEST »
0
Nella Activity principale ho:

Codice (Java): [Seleziona]
                RequestHttp richiestaLogin = new RequestHttp(urlLogin,postParams);
                AsyncHttp asyncHttp = new AsyncHttp();
                asyncHttp.execute(richiestaLogin);


Codice (Java): [Seleziona]
public class AsyncHttp extends AsyncTask<Object, Void, String> {

        private List<NameValuePair> postParams= new ArrayList<NameValuePair> ();
        private HttpResponse resp;



        public AsyncHttp() {
                // TODO Auto-generated constructor stub
                this.resp=null;
        }

        @Override
        protected String doInBackground(Object... params) {

                try {
                       
                        DefaultHttpClient client = new DefaultHttpClient();
                        RequestHttp o = (RequestHttp)params[0];
                        HttpPost request = new HttpPost(o.getUri());
               
                        postParams=o.getParams();
                       

                        UrlEncodedFormEntity entity;
                        entity = new UrlEncodedFormEntity(postParams, "UTF-8");  //Aggiungo i parametri alla mia richiesta
                        request.setEntity(entity);

                       
                        HttpResponse response = client.execute(request); //avvio l eseguzione del TASK
                        this.resp=response;
                        //resp = response;  // salvo la risposta

                        return response.toString();

                } catch (Exception e) {

                        return e.toString();

                }

        }

    public HttpResponse getResponse() {
               
                return resp;
        }

mi da un errore di puntatore nullo..quando esegue:

Codice (Java): [Seleziona]
        risultato=inputStreamToString(asyncHttp.getResponse().getEntity().getContent()).toString();

Codice: [Seleziona]
03-08 18:56:32.407: D/dalvikvm(1535): GC_EXTERNAL_ALLOC freed 53K, 53% free 2549K/5379K, external 1625K/2137K, paused 72ms
03-08 18:56:34.408: D/dalvikvm(1535): GC_EXTERNAL_ALLOC freed 16K, 52% free 2591K/5379K, external 2254K/2309K, paused 85ms
03-08 18:56:36.648: D/AndroidRuntime(1535): Shutting down VM
03-08 18:56:36.648: W/dalvikvm(1535): threadid=1: thread exiting with uncaught exception (group=0x40015560)
03-08 18:56:36.658: E/AndroidRuntime(1535): FATAL EXCEPTION: main
03-08 18:56:36.658: E/AndroidRuntime(1535): java.lang.NullPointerException
03-08 18:56:36.658: E/AndroidRuntime(1535):         at com.managementstudent.LoginStudent$1.onClick(LoginStudent.java:96)
03-08 18:56:36.658: E/AndroidRuntime(1535):         at android.view.View.performClick(View.java:2485)
03-08 18:56:36.658: E/AndroidRuntime(1535):         at android.view.View$PerformClick.run(View.java:9080)
03-08 18:56:36.658: E/AndroidRuntime(1535):         at android.os.Handler.handleCallback(Handler.java:587)
03-08 18:56:36.658: E/AndroidRuntime(1535):         at android.os.Handler.dispatchMessage(Handler.java:92)
03-08 18:56:36.658: E/AndroidRuntime(1535):         at android.os.Looper.loop(Looper.java:123)
03-08 18:56:36.658: E/AndroidRuntime(1535):         at android.app.ActivityThread.main(ActivityThread.java:3683)
03-08 18:56:36.658: E/AndroidRuntime(1535):         at java.lang.reflect.Method.invokeNative(Native Method)
03-08 18:56:36.658: E/AndroidRuntime(1535):         at java.lang.reflect.Method.invoke(Method.java:507)
03-08 18:56:36.658: E/AndroidRuntime(1535):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-08 18:56:36.658: E/AndroidRuntime(1535):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-08 18:56:36.658: E/AndroidRuntime(1535):         at dalvik.system.NativeStart.main(Native Method)
« Ultima modifica: 28 Aprile 2013, 11:20:24 CEST da felasandroid »

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:Problema AsyncTask
« Risposta #3 il: 28 Aprile 2013, 14:57:49 CEST »
0
Il problema é alla riga 96 di LoginStudent.
Dal tuo logcat
Codice: [Seleziona]
at com.managementstudent.LoginStudent$1.onClick(LoginStudent.java:96)
Postate il LogCat LogCat LogCat LogCat LogCat

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:Problema AsyncTask
« Risposta #4 il: 28 Aprile 2013, 15:47:24 CEST »
0
Il problema sorge quando esegui asyncHttp.getResponse() alla linea 96 di LoginStudent.java come precedentemente detto da blackgin.
Se tenti di ottenere il response prima che l'HttpClient l'abbia processato e salvato nella tua variabile "resp" otterrai un valore null, come tu stesso l'hai dichiarato nel costruttore dell'AsyncTask. Quindi ti consiglio di gestire il flusso di processo ad eventi, quindi di ottenere il tuo "response" solo quando questo sia stato processato. Puoi utilizzare il metodo execute(HttpUriRequest request, ResponseHandler<? extends T> responseHandler) dell'HttpClient, che prevede un Handler per il processamento dei dati ottenuti oppure implementare un'interfaccia custom, dipende dai tuoi gusti  :-)

Offline felasandroid

  • Utente normale
  • ***
  • Post: 345
  • Respect: +10
    • Github
    • balduzziantonio
    • balduzziantonio.unifi
    • Mostra profilo
  • Dispositivo Android:
    Huawei P8 Lite
  • Play Store ID:
    FelasTech
  • Sistema operativo:
    Windows 10
Re:Problema AsyncTask
« Risposta #5 il: 28 Aprile 2013, 16:18:45 CEST »
0
Il problema sorge quando esegui asyncHttp.getResponse() alla linea 96 di LoginStudent.java come precedentemente detto da blackgin.
Se tenti di ottenere il response prima che l'HttpClient l'abbia processato e salvato nella tua variabile "resp" otterrai un valore null, come tu stesso l'hai dichiarato nel costruttore dell'AsyncTask. Quindi ti consiglio di gestire il flusso di processo ad eventi, quindi di ottenere il tuo "response" solo quando questo sia stato processato. Puoi utilizzare il metodo execute(HttpUriRequest request, ResponseHandler<? extends T> responseHandler) dell'HttpClient, che prevede un Handler per il processamento dei dati ottenuti oppure implementare un'interfaccia custom, dipende dai tuoi gusti  :-)

ma questo Handler come lo uso?..cioè anzichè chiamare

Codice (Java): [Seleziona]
HttpResponse response = client.execute(request);
chiamo

Codice (Java): [Seleziona]
client.execute(HttpUriRequest request, ResponseHandler<? extends T> responseHandler)
ho ricercato qualche guida e ho aggiunto questo:

ResponseHandler<String> responseHandler = new BasicResponseHandler();
String response = client.execute(request,responseHandler);

ma si presenta sempre lo stesso errore..

per ora sto utilizzando una soluzione poco elegante cioè faccio un while per controllare che la risposta sia diversa da "", ma vorrei far funziore bene questo Handler
« Ultima modifica: 28 Aprile 2013, 17:12:09 CEST da felasandroid »

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:Problema AsyncTask
« Risposta #6 il: 29 Aprile 2013, 09:12:37 CEST »
0
Stai cercando di accedere ad una variabile da un thread (il Main) mentre questa viene elaborata da un altro thread asincrono (l'AsyncTask).

Ti consiglio di elaborare la response dentro il doInBackground(), in modo tale che non solo sei sicuro che è valorizzata, ma che viene elaborata anche questa in un processo asincrono.

Offline felasandroid

  • Utente normale
  • ***
  • Post: 345
  • Respect: +10
    • Github
    • balduzziantonio
    • balduzziantonio.unifi
    • Mostra profilo
  • Dispositivo Android:
    Huawei P8 Lite
  • Play Store ID:
    FelasTech
  • Sistema operativo:
    Windows 10
Re:Problema AsyncTask
« Risposta #7 il: 30 Aprile 2013, 20:18:48 CEST »
0
Stai cercando di accedere ad una variabile da un thread (il Main) mentre questa viene elaborata da un altro thread asincrono (l'AsyncTask).

Ti consiglio di elaborare la response dentro il doInBackground(), in modo tale che non solo sei sicuro che è valorizzata, ma che viene elaborata anche questa in un processo asincrono.

cioè fare un asynctask privato nella classe main?

Ps..se qualche moderatore potrebbe spostare la discussione, mi sa che ho sbagliato sezione,Multithreading e servizi direi...
« Ultima modifica: 30 Aprile 2013, 20:20:21 CEST da felasandroid »