Autore Topic: Fermare e riprendere esecuzione dello stesso AsyncTask  (Letto 603 volte)

Offline vash

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    xperia J
  • Sistema operativo:
    ubuntu 12.10
Fermare e riprendere esecuzione dello stesso AsyncTask
« il: 21 Luglio 2013, 16:45:18 CEST »
0
Salve ragazzi vi espongo il mio problema: La mia app si connette ad un DB ed effettua varie query. La connessione avviene tramite un AsyncTask che una volta recuperati i dati dal DB li mostra in una ListView. Funziona tutto ma dato che la mia app deve fare un'enorme quantità di query vorrei evitare di creare un nuovo oggetto Asynctask per ogni query ma desidererei avere solo un oggetto AsyncTask da poter terminare quando i dati finiscono di essere elaborati e riavviare quando c'è la richiesta di una nuova query. L'AsyncTask mi rimane in running anche dopo l'esecuzione della onPostExecute e il metodo cancel non mi funziona. Qualcuno ha qualche idea? Vi posto il codice , ho tolto la chiamata a isCanceled  e ai metodi non attinenti al problema

Codice (Java): [Seleziona]
public class RichiesteServer extends AsyncTask<Integer, String,RitornoServer>{
 
        static final String RICHIESTE="http://IP/Prog/file.php";
        private String richiesta;
        private String valori;
        InputStream inputstream=null;
        String risultato=null;
        ArrayList<HashMap<String,String>>ListaDati=new ArrayList<HashMap<String,String>>();
        ArrayList<HashMap<String,String>>Dati=new ArrayList<HashMap<String,String>>();
        ArrayList<HashMap<String,String>> DatiCarrello =new ArrayList<HashMap<String,String>>();
        ArrayList<NameValuePair> nvp=new ArrayList<NameValuePair>();
        RitornoServer ValoriRitorno;
        Context context;
        ProgressDialog PD;
        ListView EleProdotto;
        Scelta scelta;
       
        RichiesteServer(Context context,Scelta scelta){
                richiesta=null;
                valori=null;
                ValoriRitorno=new RitornoServer();
                this.context=context;
                PD= new ProgressDialog(context);
                this.scelta=scelta;
        }
       
       
        public RitornoServer Richieste(int opt){
               
                nvp.add(new BasicNameValuePair("richiesta",richiesta));
                 SplitString(valori,opt);
               
                try{
                        HttpClient client = new DefaultHttpClient();
                        HttpPost post= new HttpPost(RICHIESTE);
                        post.setEntity(new UrlEncodedFormEntity(nvp));
                        HttpResponse res =client.execute(post);
                        HttpEntity en=res.getEntity();
                        inputstream=en.getContent();
       
                }catch(Exception e){Log.e("TEST","Errore connessione 2 "+e.toString());}

                if(inputstream!=null){
                        try{
                                BufferedReader br=new BufferedReader(new InputStreamReader(inputstream,"iso-8859-1"),8);
                                StringBuilder stringbuilder=new StringBuilder();
                                String info=null;
                               
                                while((info = br.readLine())!=null){
                                        stringbuilder.append(info+"\n");       
                                }
                                inputstream.close();
                                risultato=stringbuilder.toString();
                               
                        }catch(Exception e){Log.e("TEST","Errore conversione risultato"+e.toString());}
                        }
               
                if((risultato.length()==0)||(risultato==null)){
                        return null;
                }
                        try{
                       
                                JSONArray Jrisultato = new JSONArray(risultato);
                                       
                                        switch(opt){
                                        case 1:
                                               
                                        break;
                                       
                                        case 2:
                                                ListaDati.clear();
                                               
                                                for(int i=0;i<Jrisultato.length();i++){
                                                        JSONObject dati=Jrisultato.getJSONObject(i);
                                                       
                                                ListaDati.add(new HashMap<String,String>());
                                                ListaDati.get(i).put("NomeNegozio", dati.getString("NomeNegozio"));
                                                ListaDati.get(i).put("Citta", dati.getString("Citta"));
                                                ListaDati.get(i).put("Provincia", dati.getString("Provincia"));
                                                ListaDati.get(i).put("Prodotto", dati.getString("Prodotto"));
                                                ListaDati.get(i).put("Modello", dati.getString("Modello"));
                                                ListaDati.get(i).put("Foto", dati.getString("Foto"));
                                                ListaDati.get(i).put("Marca", dati.getString("Marca"));
                                                ListaDati.get(i).put("Quantita", dati.getString("Quantita"));
                                                ListaDati.get(i).put("Prezzo", dati.getString("Prezzo"));
                                                ListaDati.get(i).put("Corriere", dati.getString("NomeCorriere"));
                                                ListaDati.get(i).put("TempiSpedizione", dati.getString("TempiSpedizione"));
                                                ListaDati.get(i).put("NomeSpedizione", dati.getString("NomeSpedizione"));
                                                ListaDati.get(i).put("CostoSpedizione", dati.getString("CostoSpedizione"));
                                                ListaDati.get(i).put("IDNegozio", dati.getString("IDNegozio"));
                                                ListaDati.get(i).put("IDProdotto",dati.getString("IDProdotto"));                                       
                                       
                                                }
               
                                                ValoriRitorno.SetDati(ListaDati);
                                                ValoriRitorno.SetOpt(2);
                                            break;
                                       
                                        case 3:
                                                JSONObject dati=Jrisultato.getJSONObject(0);
                                                ValoriRitorno.SetOpt(3);
                                                if(dati.get("esito").equals("SUCCES")) ValoriRitorno.SetSuccesso(true);
                                                else ValoriRitorno.SetSuccesso(false);
                                                break; 
                                               
                                        default:
                                                break;
                                        }
                               
                               
                        }catch(JSONException e){Log.e("log_tag","Errore parsing dati "+e.toString());}
                       
                       
                return ValoriRitorno;
        }
       
       
        @Override
        protected RitornoServer doInBackground(Integer... param) {
                // TODO Auto-generated method stub
                ValoriRitorno=Richieste(param[0]);
                return ValoriRitorno;
        }

        @Override
        protected void onPostExecute(RitornoServer result) {
                // TODO Auto-generated method stub
                super.onPostExecute(result);
               
                switch(result.GetOpt()){
       
                case 2:
                        Dati=result.GetDati();
               
                String[] nome = { "Foto", "Prodotto", "Marca", "Modello", "NomeNegozio","Citta",
                                  "Provincia", "Quantita","Prezzo","Corriere","NomeSpedizione",
                                  "CostoSpedizione","TempiSpedizione"};

         int[] views = { R.id.imageView1, R.id.textViewP, R.id.textViewM, R.id.textViewMod,
                         R.id.textViewNeg, R.id.textViewCi, R.id.textViewPro,
                         R.id.textViewQuan, R.id.textViewPR, R.id.textViewCor,
                         R.id.textViewNomSp,R.id.textViewCoss, R.id.textViewTs};
               
                for(int i=0;i<Dati.size();i++){
           DatiCarrello.add(new HashMap<String,String>());
           DatiCarrello.get(i).put("IDNegozio",Dati.get(i).get("IDNegozio"));
           DatiCarrello.get(i).put("IDProdotto",Dati.get(i).get("IDProdotto"));
            Dati.get(i).remove("IDNegozio");
            Dati.get(i).remove("IDProdotto");
           }
             
SimpleAdapter Adapter = new SimpleAdapter (context,Dati,R.layout.prodotto,nome,views){
       
  public View getView(int position, View convertView, ViewGroup parent) {

     if (convertView==null){
         LayoutInflater inflater=(LayoutInflater)((Activity)context).getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         convertView=inflater.inflate(R.layout.prodotto, null);
      }
      View row = super.getView(position, convertView, parent);
      ImageView foto=(ImageView)row.findViewById(R.id.imageView1);
        Button Salva=(Button)row.findViewById(R.id.buttonSalvaProdotto);
      String fotodac=Dati.get(position).get("Foto").toString();
      byte []b=Base64.decode(fotodac, 0);
      ByteArrayInputStream ins =new ByteArrayInputStream(b);
      Bitmap bm=BitmapFactory.decodeStream(ins);
      foto.setImageBitmap(bm);
      Salva.setOnClickListener(SalvaButtonListener);
       
          return row;
  }
       
};
             
try{
EleProdotto = (ListView) ((Activity)context).findViewById(R.id.listViewMarche);
EleProdotto.setAdapter(Adapter);
}catch(NullPointerException e){Log.e("TEST","Errore 3 "+e.toString());};
                break;
               
                case 3:
                       
                        break;
                       
                        default:
                               
                                break;
               
                }
               
               
PD.hide();
PD.dismiss();
        }
         public OnClickListener SalvaButtonListener=new OnClickListener(){
               
                 public void onClick(View v){
         /* Quando clicco su questo pulsante viene effettuata un'altra query ( inserisco i dati nel DB) quindi avrei bisogno di fermare questa AsyncTask e riavviarla perchè non voglio creare un altro oggetto AsyncTask*/
        }
               
        };
        @Override
        protected void onProgressUpdate(String... values) {
                // TODO Auto-generated method stub
                super.onProgressUpdate(values);
        }

        @Override
        protected void onPreExecute() {
                // TODO Auto-generated method stub
                super.onPreExecute();
                PD.setMessage("STO CERCANDO....");
                PD.setIndeterminate(true);
                PD.setCancelable(true);
                PD.show();
        }
       
}
Grazie in anticio

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:Fermare e riprendere esecuzione dello stesso AsyncTask
« Risposta #1 il: 21 Luglio 2013, 17:37:22 CEST »
0
Quando l'asynctask ha terminato il doinbackground e onpostexecute, non ci fai più niente. Devi ricrearne un altro.

Ma puoi tranquillamente crearti un tipo di asynctask che prende come parametro la query, così ne hai un solo tipo e di volta in volta lo crei passando la query che vuoi eseguire.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline vash

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    xperia J
  • Sistema operativo:
    ubuntu 12.10
Re:Fermare e riprendere esecuzione dello stesso AsyncTask
« Risposta #2 il: 21 Luglio 2013, 18:15:25 CEST »
0
Grazie bradipao ma allora se è cosi non capisco una cosa : dopo che ha finito di eseguire il doinbackgrond e il onpostexecute se si tenta di eseguire nuovamente l'execute si genera un eccezione perche l'asynctask rimane comunque in running quindi se creo un nuovo aggetto AsyncTask della stessa classe avrò un altro processo in running che non termina e così via. Mi sembra un po strano poter avviare dei thread che alla fine della loro esecuzione rimangono in running senza fare niente,è solo un sovraccarico. Credo che non sia cosi che bisogni farli terminare con cancel o almeno credo. Scusa per tutte le problematiche che mi creo ma è da pochissimo che utilizzo AsyncTask.

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:Fermare e riprendere esecuzione dello stesso AsyncTask
« Risposta #3 il: 22 Luglio 2013, 09:13:47 CEST »
+1
dopo che ha finito di eseguire il doinbackgrond e il onpostexecute se si tenta di eseguire nuovamente l'execute si genera un eccezione perche l'asynctask rimane comunque in running

Non lo lancia perché è in running, ma perché è in finished.
La documentazione di AsyncTask sul metodo execute è abbastanza chiara:
Codice (Java): [Seleziona]
Throws
IllegalStateException   If getStatus() returns either RUNNING or FINISHED.

Codice (Java): [Seleziona]
public static final AsyncTask.Status FINISHED

Indicates that onPostExecute(Result) has finished.

In ogni caso non si può mai rilanciare più volte lo stesso AsyncTask, sono operazioni one-shot.
« Ultima modifica: 22 Luglio 2013, 15:20:39 CEST da Sakazaki »