Autore Topic: Problema Thread Paralleli  (Letto 407 volte)

Offline MarcoMarco

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: 0
    • Mostra profilo
Problema Thread Paralleli
« il: 18 Giugno 2016, 14:57:16 CEST »
0
Salve a tutti sono un neofita del mondo Android ed ancor di più di quello riguardante il multi thread(Di fatti questa è la mia prima app con thread paralleli).

Di recente ho provato a creare un'app di gestione spesa che salvasse più dati in contemporanea(5 massimo) in un database locale utilizzando per ogni valore un Thread diverso che salvasse il dato in un'apposita tabella del DB

 ES: Il valore casa sulla tabella casa il valore veicoli sulla tabella veicoli e cosi via

Sono riuscito a creare con successo il Database locale usando SQLITE
sono riuscito a far partire tutti e 5 i thread facendogli salvare i valori nelle apposite tabelle

però ho riscontrato un problema che non sto riuscendo a risolvere, praticamente i valori vengono salvati 5 volte in ogni tabella ovvero se ho inserito un valore casa (es: 10) ed un valore Veicoli(es: 15) dopo che li avrò salvati mi ritroverò per ogni tabella il valore ripetuto per 5 volte quindi se sulla tabella casa sarebbe dovuta spuntare solo una riga in più con il valore 10 mi ritrovo invece 5 righe aggiunte ognuna con il valore 10

Credo di sapere pure la causa di questo problema
chiamando più volte la classe interna che estende l'asyncTask, faccio partire il metodo doInBackground più volte facendo così salvare i valori più volte nelle tabelle
Ho provato diversi metodi per evitare questo problema ma senza risultati

L'ultimo metodo che ho provato è stato provando ad aggiungere una variabile controllo e incrementandola ad ogni thread che si apre per coi controllare tramite degli if nel doInBackgroud  per evitare che i valori si salvino più volte ma non ha funzionato.
 

Allo stato attuale nel codice che vi posto qui sotto i valori non vengono nemmeno salvati perchè per qualche motivo che non sto ben capendo l'Applicazione non entra dentro le parentesi degli if come(è di sicuro c'è) se ci fosse qualcosa che non va.

Spero che qualcuno di voi sappia come risolvere questo problema Grazie

Codice (Java): [Seleziona]
public class aggiungi_pagamenti extends AppCompatActivity {
   
int controllo=0;

    BackgroundTask asyncTask1, asyncTask2, asyncTask3, asyncTask4, asyncTask5;

    EditText casa,veicoli;

DBHelper db=new DBHelper(this);

   

    String stringa="";
    String stringa_veicoli="";
    String stringa_alimenti="";
    String stringa_svago="";
    String stringa_altro="";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_aggiungi_pagamenti);

    }


    public void salva(View view){

      casa=(EditText) findViewById(R.id.editText_casa);
       stringa=casa.getText().toString();

        veicoli=(EditText) findViewById(R.id.editText_veicoli);
        stringa_veicoli=veicoli.getText().toString();

   alimenti=(EditText) findViewById(R.id.editText_alimenti);
        stringa_alimenti=alimenti.getText().toString();

        svago=(EditText) findViewById(R.id.editText_svago);
        stringa_svago=svago.getText().toString();

        altro=(EditText) findViewById(R.id.editText_altro);
        stringa_altro=altro.getText().toString();

        controllo=0;
        asyncTask1 = new BackgroundTask();
        StartAsyncTaskInParallel(asyncTask1);

         controllo=1;
        asyncTask2 = new BackgroundTask();
        StartAsyncTaskInParallel(asyncTask2);

             controllo=2;
        asyncTask3 = new BackgroundTask();
        StartAsyncTaskInParallel(asyncTask3);

        controllo=3;
        asyncTask4 = new BackgroundTask();
        StartAsyncTaskInParallel(asyncTask4);

        controllo=4;
        asyncTask5 = new BackgroundTask();
        StartAsyncTaskInParallel(asyncTask5);

    }

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    private void StartAsyncTaskInParallel(BackgroundTask task) {
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
            task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
        else
            task.execute();
    }


public class BackgroundTask extends AsyncTask<Void,Integer,String>{

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

           
             if(controllo==0){
                db.salvataggio_dati_casa(stringa);

             }
            if(controllo==1){
                db.salvataggio_dati_veicolo(stringa);

            }
            if(controllo==2){
                db.salvataggio_dati_alimenti(stringa);

            }
            if(controllo==3){
                db.salvataggio_dati_svago(stringa);

            }
            if(controllo==4){
                db.salvataggio_dati_altro(stringa);

            }


            return null;




        }
    }




Se non avete capito qualcosa o avete bisogno che io spieghi in modo dettagliato il codice basta chiedere e cerchero di spiegarlo in maniera più chiara  ;-)

Vi ringrazio in naticipo per le risposte
« Ultima modifica: 18 Giugno 2016, 16:56:51 CEST da MarcoMarco »

Offline Carni

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: +3
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S3
  • Play Store ID:
    R3D5HA
  • Sistema operativo:
    Windows 10
Re:Problema Thread Paralleli
« Risposta #1 il: 18 Giugno 2016, 18:12:03 CEST »
+1
Per avere una migliore struttura avresti potuto creare 5 classi diverse, una per ogni tipo di salvataggio.
Probabilmente non sempre funzioneranno i controlli con l'if perchè essendo thread separati la schedulazione di essi non è lineare. Quindi se lanci per primo il thread A e poi il thread B non è detto che sia eseguito prima A e poi B.

Quindi il mio consiglio è di creare 5 classi diverse dove nel "doInBackground()" esegui quello che serve a quella classe.

Se hai bisogno di chiarimenti chiedi pure.

Offline iClaude

  • Utente normale
  • ***
  • Post: 183
  • Respect: +13
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Problema Thread Paralleli
« Risposta #2 il: 20 Giugno 2016, 10:16:56 CEST »
+1
1) nel tuo esempio non occorre eseguire 5 thread separati da eseguire in parallelo.  Puoi benissimo mettere tutte le operazioni di scrittura in un unico Thread, o anche eseguirne 5 in modo sequenziale
2) per risolvere velocemente il tuo problema puoi passare la variabile controllo all'AsyncTask nel costruttore oppure direttamente al metodo doInBackground tramite execute

Offline MarcoMarco

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: 0
    • Mostra profilo
Re:Problema Thread Paralleli
« Risposta #3 il: 20 Giugno 2016, 11:42:25 CEST »
0
Per avere una migliore struttura avresti potuto creare 5 classi diverse, una per ogni tipo di salvataggio.
Probabilmente non sempre funzioneranno i controlli con l'if perchè essendo thread separati la schedulazione di essi non è lineare. Quindi se lanci per primo il thread A e poi il thread B non è detto che sia eseguito prima A e poi B.

Quindi il mio consiglio è di creare 5 classi diverse dove nel "doInBackground()" esegui quello che serve a quella classe.

Se hai bisogno di chiarimenti chiedi pure.
Fatto è ho risolto il problema Grazie  :-)

1) nel tuo esempio non occorre eseguire 5 thread separati da eseguire in parallelo.  Puoi benissimo mettere tutte le operazioni di scrittura in un unico Thread, o anche eseguirne 5 in modo sequenziale
2) per risolvere velocemente il tuo problema puoi passare la variabile controllo all'AsyncTask nel costruttore oppure direttamente al metodo doInBackground tramite execute

Ciao iClaude, si hai ragione non c'è bisogno di creare tutti questi thread però mi serviva per capire meglio il funzionamento dei thread paralleli  :-)