Autore Topic: myImageView.setVisibility (non refresha)  (Letto 1209 volte)

Offline Rolli

  • Utente junior
  • **
  • Post: 82
  • Respect: 0
    • Mostra profilo
    • voodoomedia.it
  • Dispositivo Android:
    Acer Liquid
  • Play Store ID:
    voodoomedia
  • Sistema operativo:
    Windows
myImageView.setVisibility (non refresha)
« il: 24 Marzo 2010, 10:57:39 CET »
0
Ho un problema con il refesh di una ImageView,
ho impostato un timer che richiama a intervalli di 500ms una funzione che non fa altro che impostare la visibilità della stessa alternatamente da visibile a invisibile. (la funzione avviene sul UI thread)
Il problema è che non avviene alcun refresh, l'immagine rimane fissa come se non si aggiornasse, avete idea di cosa possa essere?
In particolare quando richiamo la soft keyboard noto che un refresh ogni tanto avviene..(come se muovendo la view intera per far salire la tastiera impartisse un ordine di refresh)
se serve preparo un codice pulito da postare.. :o
« Ultima modifica: 15 Maggio 2010, 17:31:07 CEST da JD »
:)          :P    --->|^.^|<---     ;)         :D 

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:myImageView.setVisibility (non refresha)
« Risposta #1 il: 24 Marzo 2010, 11:56:59 CET »
0
posta il codice. secondo me è comunque un problema di threading.
Probabilmente stai usando un TimerTask che implementa Runnable => è una thread. 

posta il codice che vediamo :)

Offline Rolli

  • Utente junior
  • **
  • Post: 82
  • Respect: 0
    • Mostra profilo
    • voodoomedia.it
  • Dispositivo Android:
    Acer Liquid
  • Play Store ID:
    voodoomedia
  • Sistema operativo:
    Windows
Re:myImageView.setVisibility (non refresha)
« Risposta #2 il: 24 Marzo 2010, 12:12:52 CET »
0
si ma anche se richiamo la funzione da main non va!

Ho ridotto al minimo il codice e tradotto in italiano le variabili spero di non aver tralasciato nulla.. :P

Codice (Java): [Seleziona]
public class home extends Activity
{
        Timer timer;
        TimerTask timTask;
        Boolean premuto = false;
        ImageView miaImmagine;
               
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
       
        setContentView(R.layout.countries);
           
        miaImmagine = (ImageView)findViewById(R.id.immagineDaAccendereSpegnere );

            ImageView clikkami = (ImageView)findViewById( R.id.immagineClicckabile );
            clikkami.setOnClickListener
            (
                new OnClickListener()
                {
                        @Override
                        public void onClick(View v)
                        {                              
                                if(!premuto)
                                {
                                        timer = new Timer();   
                                        timer.scheduleAtFixedRate
                                        (
                                                new TimerTask()
                                                {
                                                        Boolean isOff = false;
                                                       
                                                        public void run()
                                                        {
                                                                if (isOff)
                                                                {
                                                                        on_off(8);
                                                                                Log.v("ROLLI","imposto 8");
                                                                }
                                                                else
                                                                {
                                                                        on_off(0);
                                                                                Log.v("ROLLI","imposto 0");
                                                                }
                                                                isOff=!isOff;
                                                        }
                                                }, 0, 500
                                        );
                                        premuto=!premuto;
                                }
                                else
                                {
                                        timer.cancel();                                
                                        premuto=!premuto;
                                }
                        }
                }
            );
    }
   
    public void on_off(int val)
    {
        miaImmagine.setVisibility( val );      
    }  
}

« Ultima modifica: 24 Marzo 2010, 12:14:52 CET da Rolli »
:)          :P    --->|^.^|<---     ;)         :D 

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:myImageView.setVisibility (non refresha)
« Risposta #3 il: 24 Marzo 2010, 13:56:01 CET »
0
Ciao Rolli :), come sospettavo il tuo è un problema di thread.  Un timertask è una thread, una thread non può direttamente eseguire aggiornamenti sull UI, neanche tramite un metodo (che è la stessa cosa).

Questi aggiornamenti devono essere processati da Handler,AsyncTask oppure tramite il metodo runOnUiThread.
http://www.anddev.it/index.php/topic,29.0.html

Ho adattato il tuo codice e l'ho cambiato anche un po'.Ho usato un bottone per comodità ma puoi tranquillamente usare la tua ImageView clikkami
Codice (Java): [Seleziona]
public class Demo extends Activity {
        ImageView img;
        Button btn;
        Timer t;
        boolean started = false;
        Handler h;

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
                img = (ImageView) findViewById(R.id.ImageView01);
                btn = (Button) findViewById(R.id.Button01);

                h = new Handler(new Callback() {

                        @Override
                        public boolean handleMessage(Message msg) {
                                //int what=msg.what;  puoi usare questo per fare uno switch/case per decidere cosa fare
                                switchImgVisibility();
                                return true;
                        }
                });

                btn.setOnClickListener(new OnClickListener() {

                        @Override
                        public void onClick(View v) {

                                if (!started) {

                                        Log.v("Demo", "start");
                                        t = new Timer();
                                        t.scheduleAtFixedRate(new TimerTask() {

                                                public void run() {
                                                        Log.v("Demo", "Toggle");
                                                        h.sendEmptyMessage(0);
                                                       
//     puoi usare un handler oppure questo metodo (runOnUiThread) che riceve come parametro un Runnable
                                                       
//                                                      runOnUiThread(new Runnable() {
//                                                             
//                                                              @Override
//                                                              public void run() {
//                                                                      switchImgVisibility();
//                                                                     
//                                                              }
//                                                      });
                                                       
                                                }
                                        }, 0, 500);

                                        started = true;
                                } else {
                                        t.cancel();
                                        started = false;
                                }
                        }
                });
        }

        public void switchImgVisibility() {
                if (img.getVisibility() == View.VISIBLE) {
                        img.setVisibility(View.INVISIBLE);
                } else {
                        img.setVisibility(View.VISIBLE);
                }

        }
}

PS: non c'era bisogno di tradurre i nomi delle variabili in italiano :P


Saluti,
Qlimax

Offline Rolli

  • Utente junior
  • **
  • Post: 82
  • Respect: 0
    • Mostra profilo
    • voodoomedia.it
  • Dispositivo Android:
    Acer Liquid
  • Play Store ID:
    voodoomedia
  • Sistema operativo:
    Windows
Re:myImageView.setVisibility (non refresha)
« Risposta #4 il: 24 Marzo 2010, 14:03:24 CET »
0
grazie ora provo!
le variabili in italiano non le ho fatte per te ma per far comprendere a chi non è ferrato.. :P
:)          :P    --->|^.^|<---     ;)         :D 

Offline Rolli

  • Utente junior
  • **
  • Post: 82
  • Respect: 0
    • Mostra profilo
    • voodoomedia.it
  • Dispositivo Android:
    Acer Liquid
  • Play Store ID:
    voodoomedia
  • Sistema operativo:
    Windows
Re:myImageView.setVisibility (non refresha)
« Risposta #5 il: 24 Marzo 2010, 14:25:57 CET »
0
nonostrante sia implementato questo metodo:

Codice: [Seleziona]
@Override
public boolean handleMessage(Message msg){...}

mi dice che va implementato e me ne aggiunge un altro...poi non contento dice che va implementato ancora ecc.. non capisco!! mai successo!!
:)          :P    --->|^.^|<---     ;)         :D 

Offline Rolli

  • Utente junior
  • **
  • Post: 82
  • Respect: 0
    • Mostra profilo
    • voodoomedia.it
  • Dispositivo Android:
    Acer Liquid
  • Play Store ID:
    voodoomedia
  • Sistema operativo:
    Windows
Re:myImageView.setVisibility (non refresha)
« Risposta #6 il: 24 Marzo 2010, 14:34:55 CET »
0
si era incantato...ora funziona...
:)          :P    --->|^.^|<---     ;)         :D