CERCA
PER MODELLO
FullScreen Chatbox! :)

Utente del giorno: megthebest con ben 1 Thanks ricevuti nelle ultime 24 ore
Utente della settimana: carotix con ben 4 Thanks ricevuti negli ultimi sette giorni
Utente del mese: megthebest con ben 21 Thanks ricevuti nell'ultimo mese

Pagina 1 di 2 12 ultimoultimo
Ultima pagina
Visualizzazione dei risultati da 1 a 10 su 12
Discussione:

CountDown in un thread a "loop infinito"

Se questa discussione ti è stata utile, ti preghiamo di lasciare un messaggio di feedback in modo che possa essere preziosa in futuro anche per altri utenti come te!
  1. #1
    Androidiano L'avatar di robyrocker89


    Registrato dal
    Dec 2009
    Messaggi
    53

    Ringraziamenti
    0
    Ringraziato 4 volte in 2 Posts
    Predefinito

    CountDown in un thread a "loop infinito"

    Ciao a tutti,
    viste le mie scarse conoscenze in java sto cercando di risolvere un enigma da un paio di giorni senza alcun risultato...
    Il mio intento è quello di eseguire un countdown all interno di un thread e farlo ripartire ogni volta che il timer arriva a 0...

    vi allego il codice:

    codice:
    public class Login extends Activity
    {
        /** Called when the activity is first created. */
    	private int time_total=5000;
    	private int time_tick=1000;
    	private TimerCountDown counter;
    	private Thread time;
    	
    	@Override
        public void onCreate(Bundle savedInstanceState) 
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.login);
            
            counter = new TimerCountDown(time_total,time_tick);
            
            time=new Thread(new Runnable() 
    		{
    		    public void run() 
    		    {
    		    	counter.start();
    		    }
    		});
            time.start();
          }
    
    
    public class TimerCountDown extends CountDownTimer
    {
    	public TimerCountDown(long millisInFuture, long countDownInterval) 
    	{
    		super(millisInFuture, countDownInterval);
    	}
    		 
    		@Override
    		public void onFinish() 
    		{
    			Toast err_http = Toast.makeText(Login.this, "Finito!!", Toast.LENGTH_LONG);
        	                err_http.show();
    		}
    		 
    		@Override
    		public void onTick(long millisUntilFinished) 
    		{
    			
    			Toast err_http = Toast.makeText(Login.this, "Rimanente: " + millisUntilFinished/1000, Toast.LENGTH_LONG);
        	                err_http.show();
    
    		}
    		 
    }
    Grazie in anticipo!!!

  2.  
  3. #2
    Senior Droid


    Registrato dal
    Feb 2010
    Messaggi
    305

    Ringraziamenti
    4
    Ringraziato 17 volte in 17 Posts
    Predefinito

    x
     
    1
    public class Login extends Activity
    2
    {
    3
        /** Called when the activity is first created. */
    4
        private int time_total=5000;
    5
        private int time_tick=1000;
    6
        private TimerCountDown counter;
    7
        private Thread time;
    8
        
    9
        @Override
    10
        public void onCreate(Bundle savedInstanceState) 
    11
        {
    12
            super.onCreate(savedInstanceState);
    13
            setContentView(R.layout.login);
    14
    15
            startTimer();
    16
            
    17
          }
    18
    19
    public void startTimer(){
    20
    21
            counter = new TimerCountDown(this, time_total,time_tick);
    22
            
    23
            time=new Thread(new Runnable() 
    24
            {
    25
                public void run() 
    26
                {
    27
                    counter.start();
    28
                }
    29
            });
    30
            time.start();
    31
    }
    32
    33
    public class TimerCountDown extends CountDownTimer
    34
    {
    35
            private Activity activity;
    36
        public TimerCountDown(Activity a, long millisInFuture, long countDownInterval) 
    37
        {
    38
            super(millisInFuture, countDownInterval);
    39
                    activity=a;
    40
        }
    41
             
    42
            @Override
    43
            public void onFinish() 
    44
            {
    45
                Toast err_http = Toast.makeText(Login.this, "Finito!!", Toast.LENGTH_LONG);
    46
                            err_http.show();
    47
                            
    48
                            activity.startTimer();
    49
            }
    50
             
    51
            @Override
    52
            public void onTick(long millisUntilFinished) 
    53
            {
    54
                
    55
                Toast err_http = Toast.makeText(Login.this, "Rimanente: " + millisUntilFinished/1000, Toast.LENGTH_LONG);
    56
                            err_http.show();
    57
    58
            }
    59
             
    60
    }


    L'ho scritto ora nel browser quindi perdonami se è sbagliato, cmq in linea di massima dovrebbe essere giusto.

    Una alternativa sarebbe di usare handler.postDelayed()
    Ultima modifica di eafkuor; 10-10-10 alle 17:27

  4. #3
    Androidiano L'avatar di robyrocker89


    Registrato dal
    Dec 2009
    Messaggi
    53

    Ringraziamenti
    0
    Ringraziato 4 volte in 2 Posts
    Predefinito

    Quote Originariamente inviato da eafkuor Visualizza il messaggio
    L'ho scritto ora nel browser quindi perdonami se è sbagliato, cmq in linea di massima dovrebbe essere giusto.

    Una alternativa sarebbe di usare handler.postDelayed()
    Ti ringrazio!!! funziona alla perfezione!!!
    un ultima cosa: questo thread gira "sopra" a google maps ed ogni 5 secondi esegue una query...il problema è che quando esegue la query c'è un rallentamento di google maps (va un po' a scatti per un paio di secondi)...dici che mettendo la visualizzazione della mappa in un nuovo thread risolverei il problema?

    Grazie ancora!!

  5. #4
    Senior Droid


    Registrato dal
    Feb 2010
    Messaggi
    305

    Ringraziamenti
    4
    Ringraziato 17 volte in 17 Posts
    Predefinito

    Io non so quanto convenga creare un altro Thread.
    Perché non provi ad usare un handler?

  6. #5
    Androidiano L'avatar di robyrocker89


    Registrato dal
    Dec 2009
    Messaggi
    53

    Ringraziamenti
    0
    Ringraziato 4 volte in 2 Posts
    Predefinito

    Quote Originariamente inviato da eafkuor Visualizza il messaggio
    Io non so quanto convenga creare un altro Thread.
    Perché non provi ad usare un handler?
    Ciao,
    scusa ma ho letto solo ora la risposta!

    un handler? potresti cortesemente farmi un esempio di come impostarlo?
    che vantaggi avrei rispetto al thread?

    ti ringrazio ancora!!

    ps: il codice da te postato va che è una meraviglia...peccato che ogni 5 secondi (limite che ho impostato io) esegua una query e la mappa si pianti per un paio di secondi...è risolvibile questo secondo te?

  7. #6
    Senior Droid


    Registrato dal
    Feb 2010
    Messaggi
    305

    Ringraziamenti
    4
    Ringraziato 17 volte in 17 Posts
    Predefinito

    Si, usando appunto un Handler
    Ora sono appena tornato a casa e sto un po' distrutto, domani ti faccio un esempio.
    Cmq è molto facile, devi usare Handler.postDelayed(Runnable r, long millis), poi da dentro al runnable alla fine fai if(devo ripetere l'operazione) handler.postDelayed(this, millis)
    Meglio che ti faccio un esempio domani mi sa

  8. #7
    Senior Droid


    Registrato dal
    Feb 2010
    Messaggi
    305

    Ringraziamenti
    4
    Ringraziato 17 volte in 17 Posts
    Predefinito

    Dentro la classe che esegue la query innanzitutti dichiari una variabile Handler:

    1
     
    1
    Handler handler = new Handler();


    poi ci metti una cosa così:

    12
     
    1
    private Runnable sendQuery = new Runnable(){
    2
    3
            public void run() {
    4
                
    5
                faiLaQuery();
    6
                
    7
                if(devi fare un'altra query)
    8
                    handler.postDelayed(sendQuery, 5000);
    9
                
    10
            }
    11
            
    12
        };


    per iniziare a fare le query:

    1
     
    1
    handler.post(sendQuery);

  9. #8
    Androidiano L'avatar di robyrocker89


    Registrato dal
    Dec 2009
    Messaggi
    53

    Ringraziamenti
    0
    Ringraziato 4 volte in 2 Posts
    Predefinito

    Quote Originariamente inviato da eafkuor Visualizza il messaggio
    Dentro la classe che esegue la query innanzitutti dichiari una variabile Handler:

    1
     
    1
    Handler handler = new Handler();


    poi ci metti una cosa così:

    12
     
    1
    private Runnable sendQuery = new Runnable(){
    2
    3
            public void run() {
    4
                
    5
                faiLaQuery();
    6
                
    7
                if(devi fare un'altra query)
    8
                    handler.postDelayed(sendQuery, 5000);
    9
                
    10
            }
    11
            
    12
        };


    per iniziare a fare le query:

    1
     
    1
    handler.post(sendQuery);
    mi è tutto chiaro tranne un particolare: quell if dentro al metodo run() è necessario?
    non ho ben capito il "if(devi fare un'altra query)"...

    io ho provato a impostarlo così ma dopo 2 o 3 cicli va in crash l'app:

    21
     
    1
    2
    private Runnable update_position = new Runnable(){  
    3
              
    4
            public void run() 
    5
            { 
    6
                    try
    7
                    {
    8
    //al posto del toast ci andrà la query
    9
                        Toast ok_query = Toast.makeText(Act1.this, "query eseguita", Toast.LENGTH_LONG);
    10
                        ok_query.show();
    11
                        handler.postDelayed(update_position, 5000);
    12
                    }
    13
                    catch(Exception e)
    14
                    {
    15
                        //exception...
    16
                    }           
    17
    18
            }  
    19
              
    20
        };
    21


    ovviamente poi dopo metto handler.post(update_position);
    Ultima modifica di robyrocker89; 29-10-10 alle 11:07

  10. #9
    Senior Droid


    Registrato dal
    Feb 2010
    Messaggi
    305

    Ringraziamenti
    4
    Ringraziato 17 volte in 17 Posts
    Predefinito

    Quell'if serve semplicemente per smettere di eseguire query fino all'infinito, immagino che prima o poi debba smettere no?
    Comunque posta il messaggio di errore che ti da!

    p.s. per svuotare la coda dei runnable da eseguire usa handler.removeCallbacks(update_position), forse è quello il problema

  11. #10
    Androidiano L'avatar di robyrocker89


    Registrato dal
    Dec 2009
    Messaggi
    53

    Ringraziamenti
    0
    Ringraziato 4 volte in 2 Posts
    Predefinito

    Quote Originariamente inviato da eafkuor Visualizza il messaggio
    Quell'if serve semplicemente per smettere di eseguire query fino all'infinito, immagino che prima o poi debba smettere no?
    Comunque posta il messaggio di errore che ti da!

    p.s. per svuotare la coda dei runnable da eseguire usa handler.removeCallbacks(update_position), forse è quello il problema
    il fatto è proprio quello!
    ti spiego il progetto a cui sto lavorando: in pratica l'app mi visualizza la mappa di google maps...alla pressione di un pulsante l'app fa 3 cose:
    1. aggancia il satellite GPS per la rilevazione della posizione
    2. esegue una query di update (ogni 5 secondi) su un db mysql (in remoto) delle mie coordinate
    3. esegue una query di select (ogni 5 secondi) sullo stesso db mysql per prendermi le coordinate di un altro utente in base al suo username e visualizza un overlay nella posizione relativa alle coordinate prese dalla select...

    ecco...grazie a te riesco ad eseguire le 2 query in un handler (o forse meglio 2 handler?) ogni 5 secondi...il problema è che l'interfaccia grafica si pianta per troppo tempo mentre esegue le 2 query e rende parecchio frustrante l'esperienza dell utente...mi chiedevo se c'era un modo per evitare che ciò accadesse...forse un modo sarebbe utilizzare i metodi wait() ecc... ma sinceramente non avendo grande esperienza in java (e in particolare con l'uso di thread/handler) non saprei dove piazzarli...

    ti allego il codice nella speranza che tu possa darmi una mano (si lo so, sono una persona frustrante ma se ti rompo non esitare a dirmelo!! ):

    155
     
    1
    2
    public class Act1 extends MapActivity
    3
    {
    4
    5
        private MapView mapView;
    6
        private MapController mc;
    7
        private LocationManager locationManager;
    8
        private MyLocationOverlay myLocationOverlay;
    9
        
    10
        private String tvLatitudine;
    11
        private String tvLongitudine;
    12
        private TextView tvLatitudine2;
    13
        private TextView tvLongitudine2;
    14
        
    15
        //private TextView tvLatitudine;
    16
        //private TextView tvLongitudine;
    17
        protected boolean _active = true;
    18
        protected int _splashTime = 5000;
    19
        
    20
        private int time_total=5000;
    21
        private int time_tick=1000;
    22
        private Thread time;
    23
        
    24
        private Intent login_user;
    25
        private Intent login_user_search;
    26
        private Intent login_user_myfriends;
    27
        private Intent login_user_myfollower;
    28
        private Intent login_user_mynewfollower;
    29
        private String pkg;
    30
        
    31
        private String pkg_search=null;
    32
        private String pkg_myfriends=null;
    33
        private String pkg_myfollower=null;
    34
        private String pkg_mynewfollower=null;
    35
        private int new_follower;
    36
        private GeoPoint point2;
    37
        private Handler handler = new Handler(); 
    38
        private Handler handler2 = new Handler(); 
    39
        private String user;
    40
        private int lng=0;
    41
        private int ltt=0;
    42
        
    43
        //Metodo "main()" che viene lanciato all inizio dell'app.
    44
        //Carica e visualizza la mappa di Google Maps
    45
        @Override   public void onCreate(Bundle savedInstanceState) 
    46
        {
    47
            super.onCreate(savedInstanceState);
    48
            setContentView(R.layout.main);
    49
    50
            mapView = (MapView) findViewById(R.id.mapview);
    51
            mapView.setBuiltInZoomControls(true);
    52
            mc = mapView.getController();       
    53
        }
    54
            
    55
        final Runnable update_position = new Runnable()
    56
        {
    57
            public void run() 
    58
            {
    59
                //eseguo l'update della mia posizione
    60
                    update_mylocation();
    61
                handler.postDelayed(this, 8000);
    62
            }
    63
        };
    64
        
    65
        final Runnable see_friends = new Runnable()
    66
        {
    67
            public void run() 
    68
            {
    69
                //select delle coordinate dell'altro utente
    70
                i_see_my_friend();
    71
             
    72
                    //Gestiamo gli Overlay
    73
            Drawable img = getResources().getDrawable(R.drawable.pushpin);
    74
                Posizioneutente overlays_interesse = new Posizioneutente(getBaseContext(),img,ltt,lng);
    75
    76
                //sovrappongo l'Overlay
    77
                mapView.getOverlays().add(overlays_interesse);
    78
                handler2.postDelayed(this, 8000);
    79
            }
    80
        };
    81
        
    82
        @Override
    83
        protected boolean isRouteDisplayed() {
    84
            return false;
    85
        }
    86
        
    87
        //Creazione del menù
    88
        @Override
    89
        public boolean onCreateOptionsMenu(Menu menu)
    90
        {
    91
            super.onCreateOptionsMenu(menu);
    92
             menu.add(0,0,1,"I'm here!").setIcon(R.drawable.imhere);
    93
            return true;
    94
        }
    95
        
    96
        @Override
    97
        public boolean onOptionsItemSelected(MenuItem item) {
    98
        switch (item.getItemId()) {
    99
        
    100
        //Localizzazione della posizione tramite GPS e disegno del pallino azzurro
    101
        case 0:
    102
            locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    103
            boolean isGPS = locationManager.isProviderEnabled (LocationManager.GPS_PROVIDER);
    104
            
    105
            if(isGPS==true)
    106
            {
    107
                myLocationOverlay = new MyLocationOverlay(this, mapView);
    108
                List<Overlay> overlays = mapView.getOverlays();
    109
                overlays.add(myLocationOverlay);
    110
                myLocationOverlay.enableMyLocation();
    111
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,0, new GeoUpdateHandler());
    112
                handler.postDelayed(update_position, 8000);
    113
                handler2.postDelayed(see_friends, 8000);
    114
                
    115
            }
    116
            //else
    117
            {
    118
                GPS_Settings();
    119
            }
    120
        break;
    121
    122
        }
    123
        return false;
    124
        }
    125
        
    126
        //Memorizzazione e visualizzazione in tempo reale delle coordinate GPS
    127
        public class GeoUpdateHandler implements LocationListener 
    128
        {
    129
            public void onLocationChanged(Location location) 
    130
            {
    131
                int lat = (int) (location.getLatitude() * 1E6);
    132
                int lng = (int) (location.getLongitude() * 1E6);
    133
    134
            tvLatitudine=Double.toString(getRound(location.getLatitude(), 5));
    135
                tvLongitudine=Double.toString(getRound(location.getLongitude(), 5));
    136
                
    137
                
    138
                //GeoPoint point = new GeoPoint(lat, lng);
    139
                
    140
                //mc.animateTo(point);
    141
            }
    142
            
    143
            public void onProviderDisabled(String provider) {}
    144
            public void onProviderEnabled(String provider) {}
    145
            public void onStatusChanged(String provider, int status, Bundle extras) {}
    146
        }
    147
        
    148
        //Metodo di conversione e calcolo delle coordinate in "double"
    149
        public static double getRound(double x, int digits)
    150
        {
    151
            double powerOfTen = Math.pow(10, digits);
    152
            return ((double)Math.round(x * powerOfTen) / powerOfTen);
    153
        }
    154
    }
    155




    ho tagliato delle parti che non servivano a nulla per semplificare un po'...
    ho provato a fare 2 handler al posto di uno ma non cambia nulla...
    sicuramente c'è qualcosa che va sistemato in termini di "sincronizzazione" e di priorità...
    se ti va dacci un occhio...se un giorno ci incontreremo non esiterò a offrirti da bere...anzi, ti compro il bar!!!
    Ultima modifica di robyrocker89; 29-10-10 alle 10:57

Pagina 1 di 2 12 ultimoultimo
Ultima pagina

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire risposte
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Torna su
Privacy Policy