Autore Topic: Cambiare Set visibilità a imageview dentro un runnable... Come?  (Letto 898 volte)

Offline uelfox

  • Nuovo arrivato
  • *
  • Post: 38
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Tablet mediacom 8" MP842M
  • Sistema operativo:
    Win 7
Ciao, vorrei rendere visibile un imageview all'inizio di un evento Runnable, e poi farlo sparire rendendolo invisibile quando finisce, ma il imageview rimane sempre nascosto, anche se il ciclo dura qualche secondo....
Come posso fare?

Offline tonno16

  • Utente storico
  • *****
  • Post: 1228
  • Respect: +59
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Cambiare Set visibilità a imageview dentro un runnable... Come?
« Risposta #1 il: 15 Agosto 2015, 00:54:02 CEST »
0
Un asynk task ha 3 callback. Una che viene chiamata all' inizio e di chiama onPreExecute(). Poi c'è doInBackground() che esegue la parte sporca. Infine c'è onPostExecute() che viene chiamata alla fine.
A te serve la prima e l' ultima che ho elencato.
Comunque renderla invisibile alla fine ti basterebbe anche solo onPostExecute() dato che di default tutto è visible

Offline uelfox

  • Nuovo arrivato
  • *
  • Post: 38
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Tablet mediacom 8" MP842M
  • Sistema operativo:
    Win 7
Re:Cambiare Set visibilità a imageview dentro un runnable... Come?
« Risposta #2 il: 15 Agosto 2015, 18:00:07 CEST »
0
Ciao, ho provato a sostituire i miei Runnable con dei Asynctask, ma la app va in crash quando tento di aggiornare l'UI all'interno di onPreExecute o onInBackground!!!

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Cambiare Set visibilità a imageview dentro un runnable... Come?
« Risposta #3 il: 15 Agosto 2015, 18:32:31 CEST »
0
Se si è scatenato un errore è prassi riportare l'esatto errore e il logcat generato, altrimenti difficilmente riceverai una risposta.

Inviato dal mio Nexus 5 utilizzando Tapatalk

adb logcat | tee /tmp/logcat | grep TAG

Offline uelfox

  • Nuovo arrivato
  • *
  • Post: 38
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Tablet mediacom 8" MP842M
  • Sistema operativo:
    Win 7
Re:Cambiare Set visibilità a imageview dentro un runnable... Come?
« Risposta #4 il: 15 Agosto 2015, 23:58:14 CEST »
0
Questo è l'estratto del logcat:
Codice: [Seleziona]
08-15 23:53:03.977  17768-17790/com.example.jarvis.app E/AndroidRuntime﹕ FATAL EXCEPTION: Timer-0
    android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
            at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4899)
            at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:912)
            at android.view.ViewGroup.invalidateChild(ViewGroup.java:4078)
            at android.view.View.invalidate(View.java:10389)
            at android.view.View.setFlags(View.java:8491)
            at android.view.View.setVisibility(View.java:5719)
            at com.example.jarvis.app.MainActivity$Termostato.onPreExecute(MainActivity.java:1240)
            at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586)
            at android.os.AsyncTask.execute(AsyncTask.java:534)
            at com.example.jarvis.app.MainActivity$12.run(MainActivity.java:701)
            at java.util.Timer$TimerImpl.run(Timer.java:284)

Sul display appare: "L'applicazione si è bloccata in modo anomalo."

Offline tonno16

  • Utente storico
  • *****
  • Post: 1228
  • Respect: +59
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Cambiare Set visibilità a imageview dentro un runnable... Come?
« Risposta #5 il: 16 Agosto 2015, 00:31:00 CEST »
0
Posta il codice del tuo asynk

Offline uelfox

  • Nuovo arrivato
  • *
  • Post: 38
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Tablet mediacom 8" MP842M
  • Sistema operativo:
    Win 7
Re:Cambiare Set visibilità a imageview dentro un runnable... Come?
« Risposta #6 il: 02 Settembre 2015, 21:59:46 CEST »
0
Eccomi di nuovo online.....

Questo uno stralco un po alleggerito, del codice:

Codice: [Seleziona]
public class MainActivity extends Activity {
    ImageView prev1;
    ImageView prev2;
    ImageView prev3;
    Timer clock_base;
   
    prev1 = (ImageView) findViewById(R.id.imagePrev1);
    prev2 = (ImageView) findViewById(R.id.imagePrev2);
    prev3 = (ImageView) findViewById(R.id.imagePrev3);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        final SharedPreferences settaggi;
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = getApplicationContext();

        settaggi = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
        clock_base = new Timer();
        clock_base.schedule(new TimerTask() {
            @Override
            public void run() {
                new Meteo().execute();
                new Chiamateperse().execute();
                new Termostato().execute();
            }, 0, 2000);
        }
    }
 
    private class Meteo extends AsyncTask<Void, Void, String> {
       
        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            prev1.SetVisibility(View.VISIBLE);
        }

        @Override
        protected String doInBackground(Void... arg0) {
            publishProgress();

            Thread.sleep(800);

            return "";
        }

        @Override
        protected void onProgressUpdate(Void... arg0){
            super.onProgressUpdate();

            prev1.SetVisibility(View.UNVISIBLE);
        }

    private class ChiamatePerse extends AsyncTask<Void, Void, String> {
       
        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            prev2.SetVisibility(View.VISIBLE);
        }

        @Override
        protected String doInBackground(Void... arg0) {
            publishProgress();

            Thread.sleep(800);
            return "";
        }

        @Override
        protected void onProgressUpdate(Void... arg0){
            super.onProgressUpdate();
       
            prev2.SetVisibility(View.UNVISIBLE);
        }

        private class Termostato extends AsyncTask<Void, Void, String> {
       
        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            prev3.SetVisibility(View.VISIBLE);
        }

        @Override
        protected String doInBackground(Void... arg0) {
            publishProgress();

            Thread.sleep(800);
            return "";
        }

        @Override
        protected void onProgressUpdate(Void... arg0){
            super.onProgressUpdate();
       
            prev3.SetVisibility(View.UNVISIBLE);
        }

In teoria mi dovrei trovare una sequenza di ImageView che lampeggiano, in base a quale parte del codice sta elaborando, ma invece no.
Dove sbaglio?

Offline iClaude

  • Utente normale
  • ***
  • Post: 242
  • Respect: +17
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Cambiare Set visibilità a imageview dentro un runnable... Come?
« Risposta #7 il: 03 Settembre 2015, 11:20:14 CEST »
0
Il problema potrebbe dipendere da questo:
Tu stai creando degli AsyncTask all'interno di thread separati tramite Timer e TimerTask.
La classe AsyncTask al suo interno utilizza un Handler per postare messaggi al Looper del thread della GUI (in pratica per aggiornare la GUI), ma se l'AsyncTask é creato in un thread separato il suo Handler interno sarà associato a tale thread separato e quindi non può modificare la UI.
In conclusione gli AsyncTask vanno creati sempre nel thread della GUI.

Offline uelfox

  • Nuovo arrivato
  • *
  • Post: 38
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Tablet mediacom 8" MP842M
  • Sistema operativo:
    Win 7
Re:Cambiare Set visibilità a imageview dentro un runnable... Come?
« Risposta #8 il: 03 Settembre 2015, 11:37:43 CEST »
0
Grazie.
Come potrei sistemare il codice?

Offline iClaude

  • Utente normale
  • ***
  • Post: 242
  • Respect: +17
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Cambiare Set visibilità a imageview dentro un runnable... Come?
« Risposta #9 il: 03 Settembre 2015, 11:43:57 CEST »
0
Visto che hai usato Timer e TimerTask non serve usare degli AsyncTask. Semplicemente utilizza il metodo run dei TimerTask, con l'unica particolarità che quando devi aggiornare la UI puoi utilizzare il metodo Activity.runOnUiThread a cui devi passare un Runnable al cui interno aggiorni la UI.

Offline uelfox

  • Nuovo arrivato
  • *
  • Post: 38
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Tablet mediacom 8" MP842M
  • Sistema operativo:
    Win 7
Re:Cambiare Set visibilità a imageview dentro un runnable... Come?
« Risposta #10 il: 03 Settembre 2015, 12:49:39 CEST »
0
Quindi sostituisco i Asynk con Runnable.... ma mi si ripresenta il problema che avevo all'inizio.
Inizialmente avevo dei Runnable x aggiornare la UI, ma come ho scritto all'inizio di questo post, la cosa non funziona come vorrei....

Offline iClaude

  • Utente normale
  • ***
  • Post: 242
  • Respect: +17
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Cambiare Set visibilità a imageview dentro un runnable... Come?
« Risposta #11 il: 03 Settembre 2015, 12:52:57 CEST »
0
Posta il codice e specifica l'errore...