Autore Topic: Problemi con AsyncTask per un Http in Post ad un DB  (Letto 212 volte)

Offline IL_PAGO

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Honor8
  • Sistema operativo:
    windows
Problemi con AsyncTask per un Http in Post ad un DB
« il: 09 Gennaio 2018, 17:51:57 CET »
0
Ciao a tutti,
Scusate ma sono bloccato da diverse settimane con un problema con un asyncTask che gestisce la chiamata ad un server in Post passando dei parametri ad un file PHP su un server Ubuntu.
Praticamente quando arriva il momento di chiamare l'asyncTask invece di aspettare che quest ultimo abbia finito tutte le procedure,l'Activity continua a eseguire il codice mandando in blocco tutta l'app dato che i parametri restituiti dall Async servono per proseguire.
E' la prima volta che mi trovo ad aver a che fare con le asyncTask e dopo aver letto mille post e visto mille tutorial non sono riuscito a cavarne molto.
VI spiego in breve quello che voglio fare:
--- Da un activity principale dove acquisisco dei valori li voglio inviare tramite Json ad un file PHP che farà delle ricerche in un DB e mi restituirà le informazioni richieste... vi copio qui sotto parte del codice e commenterò le parti che mi danno dei problemi:

il MAinActivity da cui parte tutti nominato Find_Place:
Codice (Java): [Seleziona]
// Questo è il bottone che lancia la richiesta al server

BTFind.setOnClickListener(new View.OnClickListener() {
                                     @Override
                                     public void onClick(View v) {
                                       
 //creo la stringa da passare per inviare i dati al mio server
                                       
 String Fpos = String.valueOf(Spinner_Family_position);
                                         String Catpos = String.valueOf(Spinner_Category_position);

                                         // TODO: FinD_Place LANCIO IL SENDER......
                                         Log.v(TAG,"Lancio il sender.....");

                                         String urlAddress = "http://192.168.1.250/var/www/html/Find_First.php";
                                         Sender s = new Sender(urlAddress, ID_String, Fpos, Catpos, Nazione_Market, Company_MKT);
                                         // // TODO: 03/07/2017  verifico se il risultato è positivo
                                         s.execute();

// Il problema è che l'app continua ad andare a vanti senza aspetare che l AsyncTask abbia finito quindi il risultato è sempre sbagliato!!!!
                                       
                                         if(s != null){

                                             //utilityBOperation.PassJsonData(response.toString());
                                             // IL RISULTATO è POSITIVO
                                             Log.v(TAG,"Find_Place:Il risultato è positivo Valore s:  "+ s);
// Codice nel caso il valore si positivo

Adesso vi inserisco le seconda classe java chiamata Sender da cui parte l'asyncTask:
Codice (Java): [Seleziona]
public class Sender extends AsyncTask<Void,String,String>{

    // TODO: Sender: inizializzo le variabili della classe AsyncTask

    Context c;
    String urlAddress,Id_String,GRM_Family,GRM_Prodoct,MK_Nation, MK_Company;
    ProgressDialog pd ;

    // TODO: Sender: Metodo Sender per inviare i dati al server
    public Sender( String urlAddress, String id_string, String fpos, String catpos, String nazione_market, String Company_MKT) {

        // TODO: Sender: inizializzo le variabili del Metodo sender
        this.urlAddress=urlAddress;
        this.Id_String=id_string;
        this.GRM_Family=fpos;
        this.GRM_Prodoct=catpos;
        this.MK_Nation= nazione_market;
        this.MK_Company = Company_MKT;
        Log.v(TAG,"Sono entrato nel sender");
    }

     // Show Progres dialog while download data
    @Override
    protected void onPreExecute(){
        super.onPreExecute();

        pd= new ProgressDialog(c);
        pd.setTitle("Send");
        pd.setMessage("Sending..... Please wait");
        pd.show();
        Log.v(TAG,"Sender: onPreExecute");
    }

    @Override
    protected String doInBackground(Void... params) {
        Log.v(TAG,"Sender: doInBackground");

// questo è il metodo che invierà i dati

        return this.send();
    }

    /*
    1. Called when job is ovwer
    2. We dismiss or pd
    3. Receive a string from doinbackground
     */


    @Override
    protected void onPostExecute(String response){
         super.onPostExecute(response);
        pd.dismiss();
        if (response!= null){
            //SUCCESS
            Toast.makeText(c,response,Toast.LENGTH_LONG).show();
        }
    }

    private String send(){

        // CONNECT
        Log.v(TAG,"Sender: sono nel send ...");
//QUI RICHIEDO LA CONNESSIONE AL SERVER

        HttpURLConnection con = utilityBOperation.Connect(urlAddress);
        Log.v(TAG,"Sender/ send: valore del risultato della connessione al server"+ con);
        if (con==null){
            Log.v(TAG,"Sender: Il risultato del HttpURLConnection è nullo : " + con);
            return null;
        }
        try {
            Log.v(TAG,"Sender: Il risultato del HttpURLConnection non è nullo : " + con);
            OutputStream os = con.getOutputStream();

// QUESTO INVECE è DOVE PREPARO IL DATAPACKA  DA IN VIARE AL FILE PHP CHE SI TROVA IN UNA CLASSE JAVA APPOSITA E COMUNE A TUTTE LE ACTIVITY

            // Write
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os,"UTF-8"));
            bw.write(new DataPackager(Id_String,GRM_Family,GRM_Prodoct,MK_Nation,MK_Company).packData());

            bw.flush();

            // RELEASE RES

            bw.close();
            os.close();

            //HAS IT BEEN SUCCESSFUL?

            int responseCode=con.getResponseCode();

            if (responseCode== con.HTTP_OK){

                //GET EXACT RESPONSE
                BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
                StringBuffer response = new StringBuffer();
                String line;
                //READ LINE BY LINE
                while ((line=br.readLine())!= null){
                    response.append(line);
                }
                // RELEASE RES
                br.close();
                String JsonData = response.toString();
                JSONObject JsonOB = new JSONObject(JsonData);
                JSONArray parentArray = JsonOB.getJSONArray("response");
                JSONObject finalOB = parentArray.getJSONObject(0);

                Find_Place.Rest_Data_to_Json(finalOB);
                return response.toString();
            }else {
        }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }
Questa è il metodo Http che si occupa della connessione nella classe java in una altra classe java dove ci sono tutti i metodi comuni tra le varie Activity:
Codice (Java): [Seleziona]
// Connessione con il post preparo la httpconnection
    public static HttpURLConnection Connect(String urlAddress) {

        try {

            Log.v(TAG,"utilityBOopreation:Connect: entrato nel connect");

            URL url = new URL(urlAddress);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();

            // set propertis
            con.setRequestMethod("POST");
            con.setDoInput(true);
            con.setDoOutput(true);
            Log.v(TAG,"utilityBOopreation:Connect: Valore della connessione :  "+ con);
            return con;

        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
Qui l' ultimo metodo che è il DATAPACKAGER che si trova in una classe java apposita e comune a tutte le activity:
Codice (Java): [Seleziona]
public class DataPackager {

    String Id_string, GRM_Family, GRM_Prodoct , MK_Nation , General_MK , MK_Company;

    // Section 1.RECEIVE ALL DATA WE WANNA SEND

    public DataPackager(String Id_string, String GRM_Family, String GRM_Prodoct, String MK_Nation, String MK_Company){

        this.Id_string=Id_string;
        this.GRM_Family=GRM_Family;
        this.GRM_Prodoct=GRM_Prodoct;
        this.MK_Nation= MK_Nation;
        this.MK_Company = MK_Company;

    }
    /*
    SECTION 2
    1.PACK THEM INTO A JONSON OBJECT
    2.READ ALL THIS DATA AND ENCODEIT INTO A FORMAT THAT CAN BE SEND VIA NETWORK

     */



    public String packData(){

        JSONObject jo= new JSONObject();
        StringBuffer packedData =new StringBuffer();


        try {
            jo.put("ID_Marcket",Id_string);
            jo.put("GRM_Family",GRM_Family);
            jo.put("GRM_Prodoct",GRM_Prodoct);
            jo.put("MK_Nation", MK_Nation);
            jo.put("MK_Company",MK_Company);

            Boolean FirstValue=true;
            Iterator it=jo.keys();

            do {
                String Key=it.next().toString();
                String value=jo.get(Key).toString();
                if (FirstValue){
                    FirstValue=false;
                }else {
                    packedData.append("&");
                }

                packedData.append(URLEncoder.encode(Key,"UTF-8"));
                packedData.append("=");
                packedData.append(URLEncoder.encode(value,"UTF-8"));


            }while (it.hasNext());
            return packedData.toString();

        } catch (JSONException | UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }
}

Spero di avervi copiato tutto il necessario, sono neofita e mi sa che mi sono imbarcato in un idea piu grande di me ma se voi poteste aiutarmi ve ne sarei grato anche correggendomi il codice io sono sempre pronto ad imparare cose nuove!!!!!
Grazie ancore per l'aiuto in anticipo. :-)

Offline berpao

  • Utente junior
  • **
  • Post: 100
  • Respect: +7
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Play Store ID:
    Paolo Bersan
Re:Problemi con AsyncTask per un Http in Post ad un DB
« Risposta #1 il: 10 Gennaio 2018, 10:58:07 CET »
+1
Ciao,
è normale il comportamento che rilevi. L'asyncTask, essendo appunto asynchronous, lavora in un proprio thread e quindi il main thread prosegue per la propria strada. Dovresti spostare le attività che vorresti fare alla fine della richiesta nell'evento "onPostExecute" della tua classe Sender. Per rendere utilizzabile la classe Sender da più activity potresti passargli un tuo listener che poi viene chiamato nel onPostExecute.

Quindi io farei:
1) Mi dichiarerei una interfaccia tipo questa:
Codice (Java): [Seleziona]
public interface IRequestListener {
    //ovviamente puoi dargli il nome che vuoi, io ho scelto di chiamarli come gli eventi dell'asyncTask
    public void onPreExecute();
    public void onPostExecute(String response);
}

2) Aggiungerei nella classe Sender un metodo pubblico come questo:
Codice (Java): [Seleziona]
public void setOnRequestListener(IRequestListener listener) {
    this._listener = listener;
}

dove this_listener è un campo interno della classe dichiarato così:
Codice (Java): [Seleziona]
public class Sender extends AsyncTask<Void,String,String>{
    protected IRequestListener _listener=null;
    ......
}

3) in entrambi gli eventi della tua classe sender chiami il tuo listener così:
Codice (Java): [Seleziona]
@Override
    protected void onPreExecute(){
        super.onPreExecute();

        pd= new ProgressDialog(c);
        pd.setTitle("Send");
        pd.setMessage("Sending..... Please wait");
        pd.show();
        Log.v(TAG,"Sender: onPreExecute");

        // CODICE DA AGGIUNGERE
        if (this._listener!=null) {
            this._listener.onPreExecute();
        }
    }

    @Override
    protected void onPostExecute(String response){
         super.onPostExecute(response);
        pd.dismiss();
        if (response!= null){
            //SUCCESS
            Toast.makeText(c,response,Toast.LENGTH_LONG).show();
        }

        // CODICE DA AGGIUNGERE
        if (this._listener!=null) {
            this._listener.onPostExecute(response);
        }
    }

4) a questo punto ti basta chiamare nella tue activity il metodo "setOnRequestListener" passandogli una istanza di IRequestListener :

Codice (Java): [Seleziona]
Sender s = new Sender(urlAddress, ID_String, Fpos, Catpos, Nazione_Market, Company_MKT);
IRequestListener list=new IRequestListener() {
  @Override
    public void onPreExecute() {
         // do what you need
    }

    @Override
    public void onPostExecute(String response) {
     // do what you need
   }
}
s.setOnRequestListener(list);
.....


In questo modo sposti il codice da compiere alla fine della richiesta http in ogni activity e non lo cabli dentro la classe Sender.

Spero di essere stato chiaro, se hai dubbi, postali.
Ciao
P

PS
CONTROLLA IL CODICE PERCHE' L'HO SCRITTO AL VOLO E NON SO SE E' GIUSTO, CI POSSONO ESSERE ERRORI DI SINTASSI E ALTRO.... :)
« Ultima modifica: 10 Gennaio 2018, 11:15:41 CET da berpao »

Offline IL_PAGO

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Honor8
  • Sistema operativo:
    windows
Re:Problemi con AsyncTask per un Http in Post ad un DB
« Risposta #2 il: 11 Gennaio 2018, 18:10:40 CET »
0
Prima di tutto ti voglio ringraziare per la disponibilità  berpao!!!!! :D :D
 
Però ho una perplessità, io ho creato la classe  Sender.java per creare un unica classe di chiamata per evitare di ripetere le procedure e cosi non vanifico tutto? (nn è una critica ma solo un chiarimento perchè non mi è chiaro).

ho provveduto a creare l' interfaccia ma quello che non ho ben capito è cosa devo inserire in questa parte: :-)
Codice (Java): [Seleziona]
IRequestListener list  = new IRequestListener() {
                                             @Override
                                             public void onPreExecute() {
// qui devo copiare la parte che ho scritto nell asynctask del sender?

                                             }

                                             @Override
                                             public void onPostExecute(String response) {
// qui devo copiare la parte che ho scritto nell asynctask del sender?

                                             }
                                         };
                                         s.setOnRequestListener(list);

oppure devo inserire tutta la parte successiva a seconda della risposta positiva o negativa del DB?
quindi la chiamata alle altre activity a seconda del risultato positivo o negativo???

Scusa ma approfitto ancora della tua disponibilità per un chiarimento sulla chiamata http:
Perchè anche se la chiamata al server non va a buon fine non mi da l'errore ma viene sempre mostrata come positiva?
Codice (Java): [Seleziona]
public static HttpURLConnection Connect(String urlAddress) {

        try {

            Log.v(TAG,"utilityBOopreation:Connect: entrato nel connect");

            URL url = new URL(urlAddress);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();

            // set propertis
            con.setRequestMethod("POST");
            con.setDoInput(true);
            con.setDoOutput(true);
            Log.v(TAG,"utilityBOopreation:Connect: Valore della connessione :  "+ con);
            return con;

        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
Questo è il metodo send all interno delal classe Sender.java che viene richiamato nel metodo asiìynctask doInBackground
Codice (Java): [Seleziona]
protected String doInBackground(Void... params) {
        Log.v(TAG,"Sender: doInBackground");
        return this.send();
    }
Grazie ancora per la disponibilità e i chiarimenti :-P :-P :-P

Offline berpao

  • Utente junior
  • **
  • Post: 100
  • Respect: +7
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Play Store ID:
    Paolo Bersan
Re:Problemi con AsyncTask per un Http in Post ad un DB
« Risposta #3 il: 12 Gennaio 2018, 09:02:05 CET »
+1
Ciao, vediamo se ho capito tutto quello che ti serve e se riesco a chiarirti le idee.
Citazione
Però ho una perplessità, io ho creato la classe  Sender.java per creare un unica classe di chiamata per evitare di ripetere le procedure e cosi non vanifico tutto? (nn è una critica ma solo un chiarimento perchè non mi è chiaro).
Allora da quello che ho visto la tua classe sender fa:
1) crea un progress nel pre-execute
2) esegue la richiesta nel doInBackground
3) distrugge il progress nel post-execute
Integrando il listener (IRequestListener) dovrebbe aiutarti a rendere ancora più dinamica la cosa. Mi spiego facendoti un esempio assurdo ma spero chiaro; attualmente per come è strutturato, ogni richiesta che fai genera un  progress UGUALE per tutte le richieste (stesso titolo, stesso messaggio, stesso layout, ecc). Se volessi presentare all'utente un progress più dettagliato e diverso per ogni richiesta come fai? Così come lo hai impostato non puoi, usando il listener puoi inserire nel "onPreExecute" del listener la generazione della progress come vuoi (layout titolo,ecc); la definizione della progress dialog a questo punto non è più dentro la tua classe sender, ma è esterna ad essa; quando l'evento della classe preExecute del sender viene eseguita, questo ad un certo punto chiama il preExecute del tuo listener che quindi viene eseguito a sua volta. Lo stesso discorso vale per il postExecute, che a questo punto diventa la parte importante per risolvere il problema con cui hai aperto il topic; l'async task come ti ho detto, lavora in un thread diverso da quello della main activity, viene eseguito per i fatti suoi e non puoi dire alla main activity di fermarsi ad aspettare (potresti con un loop ma è un approccio sbagliato). La cosa migliore è utilizzare gli eventi dell'asynctask (postExecute); quindi quando vuoi fare qualcosa alla fine di una chiamata asynchrona, la devi fare nel onPostExecute. In questo modo sei sicuro che la chiamata asyncrona si è conclusa e puoi continuare le operazioni. IMPORTANTISSIMO: gli eventi onPreExecute,onPostExecute, onProgressUpdate dell'asynctask lavorano nel MAIN THREAD (nel tuo case il thread della activity), mentre il doInBackground lavora come detto nel suo thread. Questo vuol dire che in questi eventi puoi modificare la UI senza problemi.

Per quanto riguarda cosa fare negli eventi del nostro listener (IRequestListener), io metterei nel onPreExecute la generazione della progress dialog e nella onPostExecute cancellerei la progress e farei le operazioni che ti servono, basandomi sul tuo codice metterei:
Codice (Java): [Seleziona]
                                         if(s != null){

                                             //utilityBOperation.PassJsonData(response.toString());
                                             // IL RISULTATO è POSITIVO
                                             Log.v(TAG,"Find_Place:Il risultato è positivo Valore s:  "+ s);
// Codice nel caso il valore si positivo

Questo meccanismo è molto potente, perchè ti permette di eseguire codice diverso nell' onPostExecute su chiamate diverse, ogni chiamata ha/può avere il suo IRequestListener che si comporta come decidi tu. Ovviamente nulla ti vieta di riutilizzare un listener che hai definito; se in tutta la tua app diciamo che hai 10 chiamate http e di queste 10 alcune, nell'onPostExecute, si devono comportare tutte alla stessa maniera, tu dichiari il listener 1 volta e poi lo passi a tutte le chiamate che ti serve. Spero di averti chiarito i dubbi, al max sono qui  ;-)

Per quanot riguarda questa domanda:
Citazione
Perchè anche se la chiamata al server non va a buon fine non mi da l'errore ma viene sempre mostrata come positiva?
non ho ben capito; cosa intendi per "non va a buon fine"? che codice http ricevi?

Ciao
Paolo

PS
Ti consiglio per le richieste di usare la libreria per android che trovi QUI... ti facilita il compito nelle chiamate....
« Ultima modifica: 12 Gennaio 2018, 10:32:57 CET da berpao »

Offline IL_PAGO

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Honor8
  • Sistema operativo:
    windows
Re:Problemi con AsyncTask per un Http in Post ad un DB
« Risposta #4 il: 16 Gennaio 2018, 18:02:38 CET »
0
ciao berpao ti ringrazio ancora per l'aiuto, ho seguito il tuo consiglio e ho gestito gli intent verso le altre Activity all interno del postExecute dell' Interfaccia,

La risoluzione di questo problema mi ha aperto nuovi problemi e soprattutto nuovi dubbi  :-P :-P :-P :-P
Adesso mi da un errore bloccante sulla ProgressDialog ma dato che non l'ho mai usata non ho ben chiaro il perchè....

Questa è la solita chiamata all AsyncTask del Main Activity.....
Codice (Java): [Seleziona]
String urlAddress = "http://mioIP/var/www/html/Find_First.php";
                                         Sender s = new Sender(urlAddress, ID_String, Fpos, Catpos, Nazione_Market, Company_MKT);
                                         // // TODO: 03/07/2017  verifico se il risultato è positivo
                                         IRequestListener list  = new IRequestListener() {
                                             @Override
                                             public void onPreExecute() {

/// COME TU MI AVEVI CONSIGLIATO HO INSERITO LA GESTIONE DELLA PROGRESSDIALOG NEL PRE EXECUTE della mia INTERFACE

                                                 Context c;
                                               //  c = this;


                                                 ProgressDialog pd = new ProgressDialog(c);
                                                 pd.setMessage("Sending..... Please wait");
                                                 pd.show();

                                             }

                                             @Override
                                             public void onPostExecute(String response) {

                                                 // VERIFICO IL RISULTATO DEL MIO SENDER
                                                 if (response== null) {
                                                    // RISULTATO NEGATIVO
                                                     SenderResponceNegative();
                                                 }else {
                                                     // RISULTATO POSITIVO
                                                     SenderResponcePositive();
                                                 }
                                             }
                                         };
                                         s.execute();
                                         s.setOnRequestListener(list);
Nella classe Sender.java gestisco sia la chiamata al mio server....
Codice (Java): [Seleziona]
public class Sender extends AsyncTask<Void,String,String>{

    // TODO: Sender: inizializzo le variabili della classe AsyncTask

   // Context c;
    String urlAddress,Id_String,GRM_Family,GRM_Prodoct,MK_Nation, MK_Company;
    ProgressDialog pd ;
    protected IRequestListener _listener=null;


    // TODO: Sender: Metodo Sender per inviare i dati al server
    public Sender( String urlAddress, String id_string, String fpos, String catpos, String nazione_market, String Company_MKT) {

        // TODO: Sender: inizializzo le variabili del Metodo sender

        this.urlAddress=urlAddress;
        this.Id_String=id_string;
        this.GRM_Family=fpos;
        this.GRM_Prodoct=catpos;
        this.MK_Nation= nazione_market;
        this.MK_Company = Company_MKT;

        Log.v(TAG,"Sono entrato nel sender");
    }

     // Show Progres dialog while download data
    @Override
    protected void onPreExecute(){
        Log.v(TAG,"Sender: onPreExecute");
        super.onPreExecute();

        Log.v(TAG,"Sender: onPreExecute post super.onPreExecute");

        /*pd= new ProgressDialog(c);
        pd.setTitle("Send");
        pd.setMessage("Sending..... Please wait");
        pd.show();*/

        Log.v(TAG,"Sender: onPreExecute post ProgressDialog");

        // LA CHIAMATA ALLA MIA INTERFACCIA
        if (this._listener!=null) {
            this._listener.onPreExecute();
        }
    }

    @Override
    protected String doInBackground(Void... params) {
        Log.v(TAG,"Sender: doInBackground");
        return this.send();
    }

    /*
    1. Called when job is ovwer
    2. We dismiss or pd
    3. Receive a string from doinbackground
     */


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

        pd.dismiss();


        if (response!= null){
            //SUCCESS
            Toast.makeText(c,response,Toast.LENGTH_LONG).show();
        }

        // CHIAMATA ALLA MIA INTERFACCIA
        if (this._listener!=null) {
            this._listener.onPostExecute(response);
        }
    }

    /* SEND DATA AND RECEIVE

     */


// QUESTA è IL METODO CHE FA LA CHIAMATA AL SERVER MA NON GESTISCE L'ERRORE... ANCHE SE CHIAMANDO LA PAGINA MI ESCE SERVER NOT FOUND LUI LO PRENDE COME SE IL RISULTATO è POSITIVO!!!!

    private String send(){

        // CONNECT
        Log.v(TAG,"Sender: sono nel send ...");
        HttpURLConnection con = utilityBOperation.Connect(urlAddress);
        Log.v(TAG,"Sender/ send: valore del risultato della connessione al server"+ con);

        if (con==null){
            Log.v(TAG,"Sender: Il risultato del HttpURLConnection è nullo : " + con);
            return null;
        }
        try {
            Log.v(TAG,"Sender: Il risultato del HttpURLConnection non è nullo : " + con);
            OutputStream os = con.getOutputStream();

            // Write
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os,"UTF-8"));
            bw.write(new DataPackager(Id_String,GRM_Family,GRM_Prodoct,MK_Nation,MK_Company).packData());

            bw.flush();

            // RELEASE RES

            bw.close();
            os.close();

            //HAS IT BEEN SUCCESSFUL?

            int responseCode=con.getResponseCode();

            if (responseCode== con.HTTP_OK){

                //GET EXACT RESPONSE
                BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
                StringBuffer response = new StringBuffer();

                String line;

                //READ LINE BY LINE
                while ((line=br.readLine())!= null){

                    response.append(line);
                }
                // RELEASE RES
                br.close();

                String JsonData = response.toString();
                JSONObject JsonOB = new JSONObject(JsonData);
                JSONArray parentArray = JsonOB.getJSONArray("response");
                JSONObject finalOB = parentArray.getJSONObject(0);

                Find_Place.Rest_Data_to_Json(finalOB);
                return response.toString();

            }else {

        }

        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }

    // METODO PER RICHIAMARE LA MIA INTERFACCIA

    public void setOnRequestListener(IRequestListener listener) {
        this._listener = listener;
    }

Per chiarezza ti inserisco anche le altre classi che  creano la connessione e che creano i pacchetti di dati da inviare anche se credo sia questo il problema perche la chiamata non resta aperta abbastanza...

METODO che apre la connessione al server però senza inviare nessun dato
Codice (Java): [Seleziona]
 // Connessione con il post preparo la httpconnection
    public static HttpURLConnection Connect(String urlAddress) {

        try {

            Log.v(TAG,"utilityBOopreation:Connect: entrato nel connect");

            URL url = new URL(urlAddress);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();

            // set propertis
            con.setRequestMethod("POST");
            con.setDoInput(true);
            con.setDoOutput(true);
            Log.v(TAG,"utilityBOopreation:Connect: Valore della connessione :  "+ con);
            return con;

        } catch (IOException e) {
            e.printStackTrace();
            Log.v(TAG,"utilityBOopreation:Connect: La connessione non è andata a buon fine : " + e);
            return null;
        }
   //     return null;
    }
Questo è la classe che si occupa di creare il pacchetto di dati da inviare
Codice (Java): [Seleziona]
public class DataPackager {

    String Id_string, GRM_Family, GRM_Prodoct , MK_Nation , General_MK , MK_Company;

    // Section 1.RECEIVE ALL DATA WE WANNA SEND

    public DataPackager(String Id_string, String GRM_Family, String GRM_Prodoct, String MK_Nation, String MK_Company){

        this.Id_string=Id_string;
        this.GRM_Family=GRM_Family;
        this.GRM_Prodoct=GRM_Prodoct;
        this.MK_Nation= MK_Nation;
        this.MK_Company = MK_Company;

    }
    /*
    SECTION 2
    1.PACK THEM INTO A JONSON OBJECT
    2.READ ALL THIS DATA AND ENCODEIT INTO A FORMAT THAT CAN BE SEND VIA NETWORK

     */



    public String packData(){

        JSONObject jo= new JSONObject();
        StringBuffer packedData =new StringBuffer();


        try {
            jo.put("ID_Marcket",Id_string);
            jo.put("GRM_Family",GRM_Family);
            jo.put("GRM_Prodoct",GRM_Prodoct);
            jo.put("MK_Nation", MK_Nation);
            jo.put("MK_Company",MK_Company);

            Boolean FirstValue=true;
            Iterator it=jo.keys();

            do {
                String Key=it.next().toString();
                String value=jo.get(Key).toString();
                if (FirstValue){
                    FirstValue=false;
                }else {
                    packedData.append("&");
                }

                packedData.append(URLEncoder.encode(Key,"UTF-8"));
                packedData.append("=");
                packedData.append(URLEncoder.encode(value,"UTF-8"));


            }while (it.hasNext());
            return packedData.toString();

        } catch (JSONException | UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }
}

NON VOGLIO ABUSARE DELLA TUA DISPONIBILITA INFATTI HO PROVATO A  RISOLVERE DA SOLO MA CON SCARSI RISULTATI....
VOLEVO SCRIVERTI IN PRIVATO MA NON SAPEVO SE AVREI SUPERATO IL LIMITE...
GRAZIE PER TUTTO L'AIUTO CHE MI DAI  ;-) ;-) ;-) ;-) ;-)

Offline berpao

  • Utente junior
  • **
  • Post: 100
  • Respect: +7
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Play Store ID:
    Paolo Bersan
Re:Problemi con AsyncTask per un Http in Post ad un DB
« Risposta #5 il: 17 Gennaio 2018, 17:08:13 CET »
0
Ciao, nessun problema, siamo qui per questo. Potevi anche scrivermi in privato...
Cmq che errore ti da? riesci a postare il messaggio dell'errore? Ho visto che hai dichiarato la progress direttamente nel onPreExecute del listener; questo vuol dire che quella variabile ha validità solo all'interno del onPreExecute(), se provi a settarla o ad usarla al di fuori di quell'evento ti darà sicuramenteun errore (non ho guardato tutto il codice, però quell'istruzione mi salta subito all'occhio!!)
 In teoria potresti fare così (se è quello il problema):

Codice (Java): [Seleziona]
String urlAddress = "http://mioIP/var/www/html/Find_First.php";
                                         Sender s = new Sender(urlAddress, ID_String, Fpos, Catpos, Nazione_Market, Company_MKT);
                                         //BERPAO: Devi dichiarla "final" perchè poi la usi in una inner class
                                         final ProgressDialog pd = new ProgressDialog(c);

IRequestListener list  = new IRequestListener() {
                                             @Override
                                             public void onPreExecute() {

/// COME TU MI AVEVI CONSIGLIATO HO INSERITO LA GESTIONE DELLA PROGRESSDIALOG NEL PRE EXECUTE della mia INTERFACE

                                                 Context c;
                                               //  c = this;

                                                 //BERPAO: Istruzione sostituita dalla dichiarazione precedente
                                                 //ProgressDialog pd = new ProgressDialog(c);
                                                 pd.setMessage("Sending..... Please wait");
                                                 pd.show();

                                             }

                                             @Override
                                             public void onPostExecute(String response) {
                                                 //BERPAO: distruggo la progress. pd ora è accessibile
                                                pd.dismiss();

                                                 // VERIFICO IL RISULTATO DEL MIO SENDER
                                                 if (response== null) {
                                                    // RISULTATO NEGATIVO
                                                     SenderResponceNegative();
                                                 }else {
                                                     // RISULTATO POSITIVO
                                                     SenderResponcePositive();
                                                 }
                                             }
                                         };

                                          .......

Se ho frainteso o se hai altri problemi fammi sapere e allega il messaggio dell'errore
Ciao
P