Autore Topic: Velocizzare connessione Database  (Letto 817 volte)

Offline twofast

  • Utente junior
  • **
  • Post: 59
  • Respect: 0
    • Mostra profilo
    • le mie app
  • Dispositivo Android:
    galaxy s3
  • Play Store ID:
    FastApp
Velocizzare connessione Database
« il: 05 Febbraio 2015, 16:07:49 CET »
0
Ciao ragazzi  in poche parole sto facendo un app mobile del mio sito internet. L'app è quasi completa ma c'è un problema che non è da poco, ci mette tantissimo a popolare la listview con dati presi dal database. Come posso velocizzare questa procedura?

Offline tonno16

  • Utente storico
  • *****
  • Post: 1228
  • Respect: +59
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Velocizzare connessione Database
« Risposta #1 il: 05 Febbraio 2015, 16:28:19 CET »
0
Forse il server in quel momento fa fatica. Ma se devi scaricare dati in versione caratteri e lettere, allora usi qualche kb di dati. Saranno le immagini il probabile problema

Offline twofast

  • Utente junior
  • **
  • Post: 59
  • Respect: 0
    • Mostra profilo
    • le mie app
  • Dispositivo Android:
    galaxy s3
  • Play Store ID:
    FastApp
Re:Velocizzare connessione Database
« Risposta #2 il: 05 Febbraio 2015, 16:41:36 CET »
0
infatti dovrò scaricare anche delle immagini ma il procedimento è già lento solo scaricando stringhe.Hai qualche idea per velocizzare?

Offline tonno16

  • Utente storico
  • *****
  • Post: 1228
  • Respect: +59
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Velocizzare connessione Database
« Risposta #3 il: 05 Febbraio 2015, 16:50:54 CET »
0
Cosa hai usato per fare le richieste?

Offline nicozumel

  • Nuovo arrivato
  • *
  • Post: 43
  • Respect: +5
    • Mostra profilo
  • Dispositivo Android:
    Huawei - P7
  • Sistema operativo:
    Windows 7
Re:Velocizzare connessione Database
« Risposta #4 il: 05 Febbraio 2015, 17:04:32 CET »
0
Ciao ,
 io uso il package com.loopj.android.http.AsyncHttpClient,
 mi trovo benissimo ma soprattutto per creare una listview di quasi 4000 righe: appena qualche secondo!

Offline tonno16

  • Utente storico
  • *****
  • Post: 1228
  • Respect: +59
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Velocizzare connessione Database
« Risposta #5 il: 05 Febbraio 2015, 17:17:49 CET »
0
Una libreria usata da molti. E si vede il perchè :)

Offline twofast

  • Utente junior
  • **
  • Post: 59
  • Respect: 0
    • Mostra profilo
    • le mie app
  • Dispositivo Android:
    galaxy s3
  • Play Store ID:
    FastApp

Offline tonno16

  • Utente storico
  • *****
  • Post: 1228
  • Respect: +59
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Velocizzare connessione Database
« Risposta #7 il: 05 Febbraio 2015, 17:42:04 CET »
+1
Ci sta, però credo che il consiglio di @nicozumel sia più che valido.

Perchè usare una libreria:
- hai sicuramente meno codice da scrivere
- A meno che ti non sia un genio la prima versione del tuo codice va sicuramente peggio del codice usato dalla libreria.
- Se qualcosa non va, cerchi su google e trovi risposte
- Se qualcosa non va puoi anche non fare niente e aspettare che la community risolve il tutto.

Implementa quella libreria e dicci se vedi miglioramenti. Pero implementala bene. Prova più varianti. Pensa :)

Offline nicozumel

  • Nuovo arrivato
  • *
  • Post: 43
  • Respect: +5
    • Mostra profilo
  • Dispositivo Android:
    Huawei - P7
  • Sistema operativo:
    Windows 7
Re:Velocizzare connessione Database
« Risposta #8 il: 05 Febbraio 2015, 18:06:49 CET »
0
Confermo tutto quello detto da tonno16.
Libreria utilissima, funziona alla perfezione, ma soprattutto molto facile da implementare, anche per un principiante (quale sono pure io)  :'(

ciao

Offline twofast

  • Utente junior
  • **
  • Post: 59
  • Respect: 0
    • Mostra profilo
    • le mie app
  • Dispositivo Android:
    galaxy s3
  • Play Store ID:
    FastApp
Re:Velocizzare connessione Database
« Risposta #9 il: 05 Febbraio 2015, 18:35:11 CET »
0
Ok proverò, adesso mi metto a cercare qualche tutorial  grazie, vi faccio sapere

Post unito: 05 Febbraio 2015, 20:02:44 CET
Ciao ,
 io uso il package com.loopj.android.http.AsyncHttpClient,
 mi trovo benissimo ma soprattutto per creare una listview di quasi 4000 righe: appena qualche secondo!
Hai qualche dritta da darmi dove cercare una guida per quello che voglio fare io?
« Ultima modifica: 05 Febbraio 2015, 20:02:44 CET da twofast, Reason: Merged DoublePost »

Offline nicozumel

  • Nuovo arrivato
  • *
  • Post: 43
  • Respect: +5
    • Mostra profilo
  • Dispositivo Android:
    Huawei - P7
  • Sistema operativo:
    Windows 7
Re:Velocizzare connessione Database
« Risposta #10 il: 05 Febbraio 2015, 21:46:01 CET »
+1

Offline twofast

  • Utente junior
  • **
  • Post: 59
  • Respect: 0
    • Mostra profilo
    • le mie app
  • Dispositivo Android:
    galaxy s3
  • Play Store ID:
    FastApp
Re:Velocizzare connessione Database
« Risposta #11 il: 05 Febbraio 2015, 23:09:35 CET »
0
Ok grazie mille  mi sei stato d'aiuto. Ora sorge un altro problema, non mi si popola la listview, cioè io nell'ovveride onSuccess faccio JsonArray , dopo popolo l'arraylist. Nell'OnCreateView  richiamo la funzione  dove vi è l'AsyncHttpClient  e poi due righe dopo popolo l'adapter e faccio listview.setAdapter(adapter)  però non lo fa, anzi addirittura sembra che non ritorna più nell'OnCreateView perchè mettendo un log,subito dopo il richiamo della funzione, non me lo fa vedere.

Offline nicozumel

  • Nuovo arrivato
  • *
  • Post: 43
  • Respect: +5
    • Mostra profilo
  • Dispositivo Android:
    Huawei - P7
  • Sistema operativo:
    Windows 7
Re:Velocizzare connessione Database
« Risposta #12 il: 06 Febbraio 2015, 15:12:20 CET »
+1
Ciao TwoFast
se magari posti un po di codice ti si riesce ad aiutare meglio, cmq ti posto il mio di codice perchè tu possa fare le dovute riflessioni.
Il tutto dentro un activity, che esegue una ricerca su di una tabella e restituisce il risultato della qry alla listview.

Codice (Java): [Seleziona]
                            RequestParams params = new RequestParams();
                            //params.put("searchstring",query);
                            //*** istanza del client ***
                                 AsyncHttpClient client = new AsyncHttpClient();
                                 
                                 client.get("http://miosito.org/xxxx/select.php?searchstring=" + query, params,new JsonHttpResponseHandler()
                                  {
                                                                @Override
                                                                 public void onSuccess(int statusCode, Header[] headers, JSONObject response)
                                                                    {
                                                                        // If the response is JSONObject instead of expected JSONArray
                                                                        try {
                                                                                        String  help =response.getString("messaggio");
                                                                                        Toast.makeText(getApplicationContext(), help, Toast.LENGTH_SHORT).show();      
                                                                                         }
                                                                             catch (JSONException e)
                                                                             {
                                                                                           e.printStackTrace();
                                                                                         }
                                                                    }
                                                                   
                                                                    @Override
                                                                    public void onSuccess(int statusCode, Header[] headers, JSONArray dati)
                                                                    {
                                                                        // Pull out the first event on the public timeline
                                                                        JSONObject rigadati = null;
                                                                                        try
                                                                                        {
                                                                                                    ArrayList<ClassRowItem> ItemList=new ArrayList<ClassRowItem>();
                                                                                                        for ( int i= 0; i < dati.length(); i++ )
                                                                                                        {
                                                                                                                 rigadati = dati.getJSONObject(i);
                                                                                                                 String help = rigadati.getString("Nome");
                                                                                                                 String help1 = rigadati.getString("Citta");
                                                                                                                 ItemList.add( new ClassRowItem(help,help1,0));
                                                                                                          }
                                                                                                    //Questa è la lista che rappresenta la sorgente dei dati della listview
                                                                                                     //ogni elemento è una mappa(chiave->valore)
                                                                                                     ArrayList<HashMap<String, Object>> data=new ArrayList<HashMap<String,Object>>();
                                                                                                        for(int i=0;i<ItemList.size();i++)
                                                                                                    {
                                                                                                           ClassRowItem rowitem=ItemList.get(i);
                                                                                                         
                                                                                                           HashMap<String,Object> ItemMap=new HashMap<String, Object>();//creiamo una mappa di valori
                                                                                                         
                                                                                                           ItemMap.put("image", rowitem.getPhotoRes()); // per la chiave image, inseriamo la risorsa dell immagine
                                                                                                           ItemMap.put("Text1", rowitem.getText1()); // per la chiave name,l'informazine sul nome
                                                                                                           ItemMap.put("Text2", rowitem.getText2());// per la chiave surnaname, l'informazione sul cognome
                                                                                                           data.add(ItemMap);  //aggiungiamo la mappa di valori alla sorgente dati
                                                                                                    }
                                                                                                        String[] from={"image","Text1","Text2"}; //dai valori contenuti in queste chiavi
                                                                                                    int[] to={R.id.personImage,R.id.Text1,R.id.Text2};//agli id delle view
                                                                                                   
                                                                                                  //costruzione dell adapter
                                                                                                   SimpleAdapter adapter=new SimpleAdapter(
                                                                                                                               context,
                                                                                                                       data,//sorgente dati
                                                                                                                       R.layout.item_layout, //layout contenente gli id di "to"
                                                                                                                       from,
                                                                                                                       to);
                                                                                                   
                                                                                                   //utilizzo dell'adapter
                                                                                               lv.setAdapter(adapter);
                                                                                              // Faccio sparire la tastiera
                                                                                               searchView.clearFocus();
                                                                                        }
                                                                                        catch (JSONException e)
                                                                                        {
                                                                                                e.printStackTrace();
                                                                                        }
                                                                     }

Offline twofast

  • Utente junior
  • **
  • Post: 59
  • Respect: 0
    • Mostra profilo
    • le mie app
  • Dispositivo Android:
    galaxy s3
  • Play Store ID:
    FastApp
Re:Velocizzare connessione Database
« Risposta #13 il: 06 Febbraio 2015, 15:58:29 CET »
0
Questa è la funzione con asynchttp
Codice (Java): [Seleziona]
public void async(){
             AsyncHttpClient client = new AsyncHttpClient();
         client.get(urlconphp,new AsyncHttpResponseHandler() {
            @Override
            public void onSuccess(String response) {
                stringaFinale=new ArrayList<ListViewItem>();

                    try{
                        JSONArray jArray = new JSONArray(response);
                        for(int i=0;i<jArray.length();i++){
                                 JSONObject json_data = jArray.getJSONObject(i);
                                postid=json_data.getString("ID");
                             
                           
                               

                              if( json_data.getInt("term_taxonomy_id")==3&&numcat==3){
                                     if( json_data.getString("post_title").equals("null")){
                                         
                                     }else{

                                        //if(urlint.get(i)==pos;
                                        stringaFinale.add(new ListViewItem(urlimmagine,json_data.getString("post_title"),postid)  ) ;

                                     }
                        }
                        }  
                 //    adapter = new ApplicationAdapter(getActivity(), stringaFinale);
                   //        textviewDatiRicevuti.setAdapter(adapter); se scrivo queste due righe mi da null l'adapter
                    }
                catch(JSONException e){
                        Log.e("log_tag", "Error parsing data "+e.toString());
                }
               Log.d("AREQ","http GET request successful");
            }
            @Override
            public void onFailure(Throwable e,String response) {
               Log.d("AREQ","http GET request failed");
            }
         });
         }
mentre questa è la parte dell'OnCreateView
Codice (Java): [Seleziona]
 @Override
       
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                        Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.home, container,
                false);

        textviewDatiRicevuti = (ListView) rootView.findViewById(R.id.listahome);
        numcat=getArguments().getInt("name");
            stringaFinale=new ArrayList<ListViewItem>();

        async();

       

           adapter = new ApplicationAdapter(getActivity(), stringaFinale);
       textviewDatiRicevuti.setAdapter(adapter);

return rootView;
}
se faccio cosi non mi fa nessun errore  ma non mi si forma la listview

Offline nicozumel

  • Nuovo arrivato
  • *
  • Post: 43
  • Respect: +5
    • Mostra profilo
  • Dispositivo Android:
    Huawei - P7
  • Sistema operativo:
    Windows 7
Re:Velocizzare connessione Database
« Risposta #14 il: 06 Febbraio 2015, 17:35:28 CET »
+1
A me sembra che ti manchi qualche pezzo, nella preparazione dell'adapter per esempio con la creazione dell arraylist di hashMap e poi nella costruzione dello stesso adapter.
Guarda il mio esempio.
Ovviamanente avrai gia debuggato e controllato che la stringa response con cui crei il jsonarray abbia i dati e nel formato corretto!