Autore Topic: listview che visualizza schermata bianca...ma solo a volte!  (Letto 585 volte)

Offline emish89

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
listview che visualizza schermata bianca...ma solo a volte!
« il: 08 Settembre 2014, 13:35:56 CEST »
0
ciao a tutti ragazzi, è il primo post che scrivo in questo forum e già fin da ora vi ringrazio per l'aiuto che mi darete!

espongo subito il problema:
io ho scritto un codice e man mano che lo ampliavo lo testavo su genymotion, senza avere nessun apparente problema di funzionamento.
adesso che il codice è ultimato però , quando sono andato a testarlo su telefono (ultimo nexus) , non carica più la listview di elenco corsi che c'era e mi lascia schermata bianca.
premessa: su genymotion è capitato qualche volta (poche) ma bastava chiudere e riaprire e tutto tornava a funzionare... non ho idea di cosa possa essere, il logcat non indica nulla :(

vi posto il codice, per qualsiasi altra cosa chiedete pure!
Codice (Java): [Seleziona]
package it.sii.android.mygym;

import it.sii.android.mygym.R;







import it.sii.android.mygym.library.DatabaseHandler;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.support.v7.app.ActionBarActivity;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AdapterView.AdapterContextMenuInfo;

public class CorsiActivity extends Activity {
        private final static int PRENOTA = 1;
        private final static int SPRENOTA = 2;
        private boolean prenotato=false;
        private boolean passato=false;
        private boolean antecedente=false;
        List<Integer> list = new LinkedList<Integer>();

   

        CustomAdapter adapter;
        long menuId;
       
         @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_corsi);
                ListView listView = (ListView)findViewById(R.id.listViewDemo);
                final List<Corso> list = new LinkedList<Corso>();
                       
               
           
       
                       
                        Thread t = new Thread(new Runnable() {
                                public void run() {
                                        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                                nameValuePairs.add(new BasicNameValuePair("id_corsi","1"));
                                InputStream is;
                               
                                try
                                {
                                        HttpClient httpclient = new DefaultHttpClient();
                                       
                                    HttpPost httppost = new HttpPost("http://xxx/readcorsi.php");
                                    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                                       
                                    HttpResponse response = httpclient.execute(httppost);
                                    HttpEntity entity = response.getEntity();
                                       
                                    is = entity.getContent();

                                    BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                                    StringBuilder sb = new StringBuilder();
                                    String line = null;
                                    while ((line = reader.readLine()) != null)
                                    {
                                      sb.append(line + "\n");
                                    }
                                    is.close();
                                       
                                    String result=sb.toString();

                                    JSONArray jArray = new JSONArray(result);
                                    for(int i=0;i<jArray.length();i++){
                                       JSONObject json_data = jArray.getJSONObject(i);
                                       
                                       list.add(new Corso(json_data.getString("nome"),json_data.getString("ora_inizio"),
                                                   json_data.getString("ora_fine"),json_data.getInt("max_persone"),json_data.getInt("num_prenotati")));
                                       
                                       
                                       Log.i("log_tag","_id: "+json_data.getInt("id_corsi")+
                                             ", nome: "+json_data.getString("nome")+
                                             ", ora_inizio: "+json_data.getString("ora_inizio")+
                                             ", ora_fine: "+json_data.getString("ora_fine")
                                             +" "+json_data.getString("max_persone")+" "
                                             +json_data.getInt("num_prenotati"));
                                       
                                    }
                                   
                                   
                                       
                            }catch(Exception e){
                      Log.e("log_tag", "Error "+e.toString());
                            }                  
                    }
                        });
                       
                        t.start();
                       
                adapter = new CustomAdapter(this, R.layout.rowcustom, list);
                listView.setAdapter(adapter);
                registerForContextMenu(listView);
                        adapter.notifyDataSetChanged();

         }
         
         
       
         
         
         
       
         
         @Override
                public void onCreateContextMenu(ContextMenu menu, View v,
                                ContextMenuInfo menuInfo) {
                        int group = Menu.FIRST;
                        menu.add(group, PRENOTA, Menu.FIRST, "Prenota");
                        menu.add(group, SPRENOTA, Menu.FIRST + 1,
                                        "Sprenota");
                }
         
                @Override
                public boolean onContextItemSelected(MenuItem item) {
                        AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
                                        .getMenuInfo();
                         menuId = info.id;
                        DatabaseHandler dbhandler=new DatabaseHandler(getApplicationContext());
                        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

                        switch (item.getItemId()) {
                        case PRENOTA:
                                   
                                prenotato=true;
                               
                                nameValuePairs.add(new BasicNameValuePair("id_corsi",String.valueOf(menuId+1)));
                            nameValuePairs.add(new BasicNameValuePair("mail_profilo",dbhandler.getUserEmail()));
                           
                            Log.i("menuId",String.valueOf(menuId));                        
                            Log.d("usermail","getUserMail = "+dbhandler.getUserEmail());

                                                           
                           
                                       
                                try{
                                    HttpClient httpclient = new DefaultHttpClient();
                                    HttpPost httppost = new HttpPost("http://xxx/aumenta_persone.php");
                                    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                                    HttpResponse response = httpclient.execute(httppost);
                                    HttpEntity entity = response.getEntity();
                                   
                            }catch(Exception e){
                                    Log.e("TEST", "Errore nella connessione http "+e.toString());
                               
                                   
                        }
                       
                       
                               
                       
                       
                   
                                adapter.notifyDataSetChanged();


                               
                                return true;
                        case SPRENOTA:
                                prenotato=false;
                               
                            nameValuePairs.add(new BasicNameValuePair("id_corsi",String.valueOf(menuId+1)));
                            nameValuePairs.add(new BasicNameValuePair("mail_profilo",dbhandler.getUserEmail()));
                           
                            Log.i("menuId",String.valueOf(menuId+1));
       
                           
                            Log.d("usermail","getUserMail = "+dbhandler.getUserEmail());

                                                           
                           
                                       
                                try{
                                    HttpClient httpclient = new DefaultHttpClient();
                                    HttpPost httppost = new HttpPost("http://xxx/decrementa_persone.php");
                                    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                                    HttpResponse response = httpclient.execute(httppost);
                                    HttpEntity entity = response.getEntity();
                                   
                            }catch(Exception e){
                                    Log.e("TEST", "Errore nella connessione http "+e.toString());
                                   
                        }
                       
                       
                               
                       
                       
                   
                                adapter.notifyDataSetChanged();


                               
                               
                               
                                return true;
                        default:
                                return super.onContextItemSelected(item);
                        }

                }
         
                public class CustomAdapter extends ArrayAdapter<Corso>{
                    public CustomAdapter(Context context, int textViewResourceId,
                            List<Corso> objects) {
                        super(context, textViewResourceId, objects);
                    }

                    @Override
                    public View getView(int position, View convertView, ViewGroup parent) {
                        LayoutInflater inflater = (LayoutInflater) getContext()
                             .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                        convertView = inflater.inflate(R.layout.rowcustom, null);
                        TextView nome = (TextView)convertView.findViewById(R.id.textViewNome);
                        TextView ora = (TextView)convertView.findViewById(R.id.textViewOrario);
                        TextView posti = (TextView)convertView.findViewById(R.id.textViewPosti);

                        Corso c = getItem(position);
                       
                        ora.setText(c.getOrainizio()+" - "+c.getOrafine());
                        nome.setText(c.getNome());
                        int num= c.getMaxpersone()-c.getNumprenotati();
                        String stringa= Integer.toString(num);

                       
                        if(!passato)
                        {
                       
                        passato=true;
                       
                        StrictMode.ThreadPolicy policy = new

                                StrictMode.ThreadPolicy.Builder()

                                .permitAll().build();

                                StrictMode.setThreadPolicy(policy);
                                               
                           
                            InputStream is ;
                       
                        DatabaseHandler dbhandler=new DatabaseHandler(getApplicationContext());
                        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                    nameValuePairs.add(new BasicNameValuePair("mail_profilo",dbhandler.getUserEmail()));

                   
                        try{
                    HttpClient httpclient = new DefaultHttpClient();
                    HttpPost httppost = new HttpPost("http://xxx/trova_prenotazioni.php");
                    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                    HttpResponse response = httpclient.execute(httppost);
                    HttpEntity entity = response.getEntity();
                    is = entity.getContent();

                            BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                            StringBuilder sb = new StringBuilder();
                            String line = null;
                            while ((line = reader.readLine()) != null)
                            {
                             
                                sb.append(line + "\n");
                            }
                            is.close();
                               
                            String result= sb.toString();

                           
                            JSONArray jArray = new JSONArray(result);
                            for(int i=0;i<jArray.length();i++){
                               JSONObject json_data = jArray.getJSONObject(i);
                               list.add(json_data.getInt("id_corso"));
                               Log.i("LOGT","_id CORSI: "+json_data.getInt("id_corso"));
                               
                               //Log.i("LOGV","_id CORSI2: "+vettore[i]);
                            }
                   
            }catch(Exception e){
                    Log.e("TEST", "Errore nella connessione http "+e.toString());
                   
        }
       
       
       
                        }
                       
                       

                       
                        posti.setText("Posti Liberi: "+ stringa);
                       
                        if(list.contains(position+1))
                                posti.setText("PRENOTATO");
                               
                               
                       
                       
                       
                                               
                        if(prenotato)
                              if(position==menuId)
                                  posti.setText("PRENOTATO");
                               
                               
                       
                       
                     
                               
                        return convertView;
                    }

                }
         
}

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:listview che visualizza schermata bianca...ma solo a volte!
« Risposta #1 il: 08 Settembre 2014, 13:42:39 CEST »
0
A occhio è un problema di "assenza di sincronizzazione" tra il thread di connessione e quello di UI: tu avvii il thread di connessione e poi imposti subito la listview senza attendere la risposta.

Poi io ti consiglio di usare una libreria per la connessione di rete, che tra l'altro fornisce ai meno esperti un metodo molto semplice per attendere la risposta.

Guarda questo esempio:
[facile] utilizzo della libreria android-async-http - Android Developers Italia
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline emish89

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
Re:listview che visualizza schermata bianca...ma solo a volte!
« Risposta #2 il: 08 Settembre 2014, 14:08:34 CEST »
0
A occhio è un problema di "assenza di sincronizzazione" tra il thread di connessione e quello di UI: tu avvii il thread di connessione e poi imposti subito la listview senza attendere la risposta.

Poi io ti consiglio di usare una libreria per la connessione di rete, che tra l'altro fornisce ai meno esperti un metodo molto semplice per attendere la risposta.

Guarda questo esempio:
[facile] utilizzo della libreria android-async-http - Android Developers Italia

grazie per la risposta velocissima.
per le async library diciamo che le metteremo , per adesso abbiamo messo le famose righe:
Codice (Java): [Seleziona]
StrictMode.ThreadPolicy policy = new

                                StrictMode.ThreadPolicy.Builder()

                                .permitAll().build();

                                StrictMode.setThreadPolicy(policy);
se intendevi per quello.
per il problema della sincronizzazione invece quale potrebbe essere una possibile soluzione?

Post unito: 09 Settembre 2014, 10:33:11 CEST
aggiungo che lo scherzo lo fa anche senza connessioni nel thread dell'UI , quindi non so proprio come provare a risolvere :(
« Ultima modifica: 09 Settembre 2014, 10:33:11 CEST da emish89, Reason: Merged DoublePost »

Offline sarahcvr

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Sistema operativo:
    Windows 7
Re:listview che visualizza schermata bianca...ma solo a volte!
« Risposta #3 il: 09 Settembre 2014, 16:22:48 CEST »
0
Anch'io ho lo stesso problema, ma anche usando l'AsyncTask non mi fa vedere nulla! Potrebbe essere un problema del telefono? Ho un nexus 5..

Offline emish89

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
Re:listview che visualizza schermata bianca...ma solo a volte!
« Risposta #4 il: 09 Settembre 2014, 16:34:03 CEST »
0
ho cambiato il codice mettendo asynctask e ve lo copio.
il problema è rimasto identico...cosa potrebbe essere?
Codice (Java): [Seleziona]
package it.sii.android.mygym;

import it.sii.android.mygym.R;







import it.sii.android.mygym.library.DatabaseHandler;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.support.v7.app.ActionBarActivity;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AdapterView.AdapterContextMenuInfo;

public class CorsiActivity extends Activity {
        private final static int PRENOTA = 1;
        private final static int SPRENOTA = 2;
        private boolean prenotato=false;
        private boolean passato=false;
        private boolean antecedente=false;
    final List<Corso> list = new LinkedList<Corso>();
    final List<Integer> lista= new LinkedList<Integer>();

   

        CustomAdapter adapter;
        long menuId;
       
         @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_corsi);
                ListView listView = (ListView)findViewById(R.id.listViewDemo);
                       
               
               
               
                HttpGetTask task = new HttpGetTask();
            task.execute();
               
            adapter = new CustomAdapter(this, R.layout.rowcustom, list);
                listView.setAdapter(adapter);
                registerForContextMenu(listView);
                        adapter.notifyDataSetChanged();

         }
         
         
         private class HttpGetTask extends AsyncTask<String,String,String>  {

                @Override
                protected String doInBackground(String... params) {
                        String result = "";
                   
                    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                        nameValuePairs.add(new BasicNameValuePair("id_corsi","1"));
                    InputStream is = null;
             
                    //http post
                    try{
                            HttpClient httpclient = new DefaultHttpClient();
                                    HttpPost httppost = new HttpPost("http://xxx/readcorsi.php");
                            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                            HttpResponse response = httpclient.execute(httppost);
                            HttpEntity entity = response.getEntity();
                            is = entity.getContent();
                    }catch(Exception e){
                            Log.e("TEST", "Errore nella connessione http "+e.toString());
                    }
                    if(is != null){
                        //converto la risposta in stringa
                        try{
                                BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                                StringBuilder sb = new StringBuilder();
                                String line = null;
                                while ((line = reader.readLine()) != null) {
                                        sb.append(line + "\n");
                                }
                                is.close();
             
                                result=sb.toString();
                        }catch(Exception e){
                                Log.e("TEST", "Errore nel convertire il risultato "+e.toString());
                        }
                       
                        System.out.println(result);
                       
                        //parsing dei dati arrivati in formato json
                        try{
                            JSONArray jArray = new JSONArray(result);
                                    for(int i=0;i<jArray.length();i++){
                                       JSONObject json_data = jArray.getJSONObject(i);
                                       
                                       list.add(new Corso(json_data.getString("nome"),json_data.getString("ora_inizio"),
                                                   json_data.getString("ora_fine"),json_data.getInt("max_persone"),json_data.getInt("num_prenotati")));
                                       
                                       
                                       Log.i("log_tag","_id: "+json_data.getInt("id_corsi")+
                                             ", nome: "+json_data.getString("nome")+
                                             ", ora_inizio: "+json_data.getString("ora_inizio")+
                                             ", ora_fine: "+json_data.getString("ora_fine")
                                             +" "+json_data.getString("max_persone")+" "
                                             +json_data.getInt("num_prenotati"));
                                       
                                    }
                        }
                        catch(JSONException e){
                                Log.e("log_tag", "Error parsing data "+e.toString());
                        }
                    }
                    else{//is è null e non ho avuto risposta
             
                    }
                                return result;
             
                   
                }

                @Override
                protected void onProgressUpdate(String... values) {
                   
                }

                @Override
                protected void onPostExecute(String result) {
                    // aggiorno la textview con il risultato ottenuto
                       
                }
             }
               

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:listview che visualizza schermata bianca...ma solo a volte!
« Risposta #5 il: 09 Settembre 2014, 18:50:24 CEST »
0
Il problema che vedo io sta in queste righe:

Codice (Java): [Seleziona]
HttpGetTask task = new HttpGetTask();
task.execute();  
adapter = new CustomAdapter(this, R.layout.rowcustom, list);
listView.setAdapter(adapter);
registerForContextMenu(listView);
adapter.notifyDataSetChanged();

Queste righe NON sono eseguite in modo completo nell'ordine in cui sono scritte. Perchè execute() agisce in PARALLELO alle altre righe e può tranquillamente finire dopo le altre due.

Detto in altro modo, è come se l'ordine reale fosse questo (perchè execute finisce dopo tutte le altre):
Codice (Java): [Seleziona]
HttpGetTask task = new HttpGetTask();
adapter = new CustomAdapter(this, R.layout.rowcustom, list);
listView.setAdapter(adapter);
registerForContextMenu(listView);
adapter.notifyDataSetChanged();
task.execute();    // è come se fosse alla fine perchè execute() finisce dopo le altre

Ed è questa la ragione per cui list è vuota al momento in cui aggiornate la ListView.

Il momento giusto in cui eseguire le righe succesive è  alla fine della execute(), ed in questo (non a caso) vi viene in aiuto la onPostExecute(). Dovrebbe bastare spostarci la notifyDataSetChanged():
Codice (Java): [Seleziona]
@Override
                protected void onPostExecute(String result) {
                    adapter.notifyDataSetChanged();
                }
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline emish89

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
Re:listview che visualizza schermata bianca...ma solo a volte!
« Risposta #6 il: 09 Settembre 2014, 23:30:40 CEST »
0
grazie mille! problema risolto con quest'ultima variante!