Autore Topic: Gestire un timer  (Letto 247 volte)

Offline Dr.Joek

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Emulatore a gogo
  • Sistema operativo:
    Windows7, Windows8.1, Ubuntu15.3, Windows10
Gestire un timer
« il: 25 Agosto 2015, 21:50:01 CEST »
0
Ciao, sono nuovo nel mondo di java e da poco ho appreso il funzionamento del timer, il problema è che tramite il onCreate ho inizializzato un timer che fa riferimento a una classe all'interno della stessa classe dell'onCreate il problema è che questa classe non può modificare il layout, gerarchia del codice: https://gyazo.com/bcfba9cfcd4180f215df5ea11d7b9632

LogCat:
Codice: [Seleziona]
08-25 15:45:03.677  17437-17437/com.example.gioele.mathup D/dalvikvm﹕ Late-enabling CheckJNI
08-25 15:45:03.713  17437-17437/com.example.gioele.mathup D/dalvikvm﹕ GC_FOR_ALLOC freed 50K, 4% free 3551K/3664K, paused 6ms, total 6ms
08-25 15:45:03.713  17437-17437/com.example.gioele.mathup I/dalvikvm-heap﹕ Grow heap (frag case) to 7.043MB for 3689724-byte allocation
08-25 15:45:03.717  17437-17443/com.example.gioele.mathup D/dalvikvm﹕ GC_FOR_ALLOC freed <1K, 2% free 7154K/7268K, paused 2ms, total 2ms
08-25 15:45:03.817  17437-17437/com.example.gioele.mathup D/dalvikvm﹕ GC_FOR_ALLOC freed 1K, 2% free 8060K/8172K, paused 3ms, total 3ms
08-25 15:45:03.857  17437-17437/com.example.gioele.mathup D/dalvikvm﹕ GC_FOR_ALLOC freed <1K, 2% free 8961K/9076K, paused 10ms, total 10ms
08-25 15:45:03.901  17437-17437/com.example.gioele.mathup D/dalvikvm﹕ GC_FOR_ALLOC freed <1K, 2% free 10420K/10536K, paused 7ms, total 7ms
08-25 15:45:03.913  17437-17437/com.example.gioele.mathup E/DATABASE OPERATIONS﹕ Database create / opened.....
08-25 15:45:03.913  17437-17437/com.example.gioele.mathup E/DATABASE OPERATIONS﹕ AVVIATO
08-25 15:45:03.933  17437-17437/com.example.gioele.mathup D/libEGL﹕ loaded /system/lib/egl/libEGL_genymotion.so
08-25 15:45:03.933  17437-17437/com.example.gioele.mathup D/﹕ HostConnection::get() New Host Connection established 0xb8fd8118, tid 17437
08-25 15:45:03.941  17437-17437/com.example.gioele.mathup D/libEGL﹕ loaded /system/lib/egl/libGLESv1_CM_genymotion.so
08-25 15:45:03.941  17437-17437/com.example.gioele.mathup D/libEGL﹕ loaded /system/lib/egl/libGLESv2_genymotion.so
08-25 15:45:03.969  17437-17437/com.example.gioele.mathup W/EGL_genymotion﹕ eglSurfaceAttrib not implemented
08-25 15:45:03.969  17437-17437/com.example.gioele.mathup E/OpenGLRenderer﹕ Getting MAX_TEXTURE_SIZE from GradienCache
08-25 15:45:03.969  17437-17437/com.example.gioele.mathup E/OpenGLRenderer﹕ MAX_TEXTURE_SIZE: 16384
08-25 15:45:03.973  17437-17437/com.example.gioele.mathup E/OpenGLRenderer﹕ Getting MAX_TEXTURE_SIZE from Caches::initConstraints()
08-25 15:45:03.977  17437-17437/com.example.gioele.mathup E/OpenGLRenderer﹕ MAX_TEXTURE_SIZE: 16384
08-25 15:45:03.977  17437-17437/com.example.gioele.mathup D/OpenGLRenderer﹕ Enabling debug mode 0
08-25 15:55:58.029  17437-17437/com.example.gioele.mathup D/dalvikvm﹕ GC_FOR_ALLOC freed 206K, 3% free 12288K/12556K, paused 4ms, total 4ms
08-25 15:55:58.041  17437-17437/com.example.gioele.mathup I/dalvikvm-heap﹕ Grow heap (frag case) to 16.150MB for 4291068-byte allocation
08-25 15:55:58.045  17437-17446/com.example.gioele.mathup D/dalvikvm﹕ GC_FOR_ALLOC freed <1K, 2% free 16478K/16748K, paused 5ms, total 5ms
08-25 15:55:58.093  17437-17437/com.example.gioele.mathup D/dalvikvm﹕ GC_FOR_ALLOC freed 2K, 2% free 19191K/19452K, paused 2ms, total 2ms
08-25 15:55:58.133  17437-17437/com.example.gioele.mathup D/dalvikvm﹕ GC_FOR_ALLOC freed <1K, 2% free 23914K/24176K, paused 2ms, total 2ms
08-25 15:55:58.173  17437-17437/com.example.gioele.mathup D/dalvikvm﹕ GC_FOR_ALLOC freed <1K, 1% free 28639K/28900K, paused 2ms, total 2ms
08-25 15:55:58.213  17437-17437/com.example.gioele.mathup D/dalvikvm﹕ GC_FOR_ALLOC freed <1K, 1% free 33363K/33624K, paused 1ms, total 2ms
08-25 15:55:58.265  17437-17437/com.example.gioele.mathup D/dalvikvm﹕ GC_FOR_ALLOC freed <1K, 1% free 38090K/38348K, paused 1ms, total 1ms
08-25 15:55:58.309  17437-17437/com.example.gioele.mathup D/dalvikvm﹕ GC_FOR_ALLOC freed <1K, 1% free 42814K/43072K, paused 2ms, total 2ms
08-25 15:55:58.353  17437-17437/com.example.gioele.mathup E/DATABASE OPERATIONS﹕ Database create / opened.....
08-25 15:55:58.357  17437-17437/com.example.gioele.mathup E/DATABASE OPERATIONS﹕ AVVIATO
08-25 15:55:58.393  17437-17437/com.example.gioele.mathup W/EGL_genymotion﹕ eglSurfaceAttrib not implemented
08-25 15:55:59.457  17437-17437/com.example.gioele.mathup D/dalvikvm﹕ GC_FOR_ALLOC freed 44K, 1% free 50962K/51068K, paused 2ms, total 2ms
08-25 15:55:59.501  17437-17437/com.example.gioele.mathup E/DATABASE OPERATIONS﹕ Database create / opened.....
08-25 15:55:59.505  17437-17437/com.example.gioele.mathup E/DATABASE OPERATIONS﹕ AVVIATO
08-25 15:55:59.569  17437-17437/com.example.gioele.mathup D/dalvikvm﹕ GC_FOR_ALLOC freed 60K, 1% free 59095K/59216K, paused 2ms, total 2ms
08-25 15:55:59.625  17437-17437/com.example.gioele.mathup W/EGL_genymotion﹕ eglSurfaceAttrib not implemented
08-25 15:56:05.509  17437-22219/com.example.gioele.mathup I/System.out﹕ la stringa letta era un numero :)
08-25 15:56:05.509  17437-22219/com.example.gioele.mathup W/dalvikvm﹕ threadid=11: thread exiting with uncaught exception (group=0xa4ca9b20)
08-25 15:56:05.509  17437-22219/com.example.gioele.mathup E/AndroidRuntime﹕ FATAL EXCEPTION: Timer-0
    Process: com.example.gioele.mathup, PID: 17437
    android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
            at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6024)
            at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:820)
            at android.view.View.requestLayout(View.java:16431)
            at android.view.View.requestLayout(View.java:16431)
            at android.view.View.requestLayout(View.java:16431)
            at android.view.View.requestLayout(View.java:16431)
            at android.view.View.requestLayout(View.java:16431)
            at android.view.View.requestLayout(View.java:16431)
            at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:352)
            at android.view.View.requestLayout(View.java:16431)
            at android.view.View.requestLayout(View.java:16431)
            at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:352)
            at android.view.View.requestLayout(View.java:16431)
            at android.view.View.requestLayout(View.java:16431)
            at android.view.View.requestLayout(View.java:16431)
            at android.widget.TextView.checkForRelayout(TextView.java:6600)
            at android.widget.TextView.setText(TextView.java:3813)
            at android.widget.TextView.setText(TextView.java:3671)
            at android.widget.TextView.setText(TextView.java:3646)
            at com.example.gioele.mathup.svolgimento$MioTask.run(svolgimento.java:3156)
            at java.util.Timer$TimerImpl.run(Timer.java:284)
08-25 15:56:05.577  17437-17437/com.example.gioele.mathup W/EGL_genymotion﹕ eglSurfaceAttrib not implemented
Codice:
Codice (Java): [Seleziona]
public class svolgimento extends Activity {
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_svolgimento);
MioTask myTask = new MioTask();
        Timer myTimer = new Timer();
// (1000 millisecondi) e poi ad intervalli di un secondo
// (sempre 1000 millisecondi)
        myTimer.schedule(myTask, 1000, 1000);
}
public class MioTask extends TimerTask {
        String relazione33;
        int numero1;
        int numero1tot;
        public void run() {
            final EditText relazione3 = (EditText) findViewById(R.id.relazione3);
            final TextView visualizzatore1 = (TextView) findViewById(R.id.visualizzatore1);
            final TextView visualizzatore3 = (TextView) findViewById(R.id.visualizzatore3);
            final EditText relazione4 = (EditText) findViewById(R.id.relazione4);
            final LinearLayout lineaprimis = (LinearLayout) findViewById(R.id.lineaprimis);
            if(relazione3.length() > 0){
                relazione33 = relazione3.getText().toString();
                if(relazione33.length() > 0){
                    try{
                        numero1=Integer.parseInt(relazione33);

                    }catch(NumberFormatException e){}

                    if(numero1==0) {
                        System.out.println("la stringa letta, conteneva almeno un carattere non numero");
                    }
                    else{
                        System.out.println("la stringa letta era un numero :)");
                        lineaprimis.setVisibility(View.VISIBLE);
                        visualizzatore1.setText(relazione33);
                        if(persona.equals("Giovanni")){
                            if(cliente == 1){
                                visualizzatore3.setText("b");                            }
                        }
                    }
                }
                numero1 = 0;

            }
        }
    }

Il problema è che appena deve eseguire i codici per cambiare testo, rendere visibile un elemento del layout ecc.. il programma crasha..
Io invece vorrei che cambi gli elementi come gli ho detto di fare... Magari è un errore banale ma io da inesperto non lo capisco.
Grazie in anticipo delle risposte.

Post unito: [time]25 Agosto 2015, 21:51:41 CEST[/time]
Non ho inserito un paio di variabili che vengono cambiate nel onCreate tipo il "cliente", ma per il resto il codice è questo

Post unito: [time]25 Agosto 2015, 21:52:48 CEST[/time]
E la variabile persona la inizializzo nell' onCreate
« Ultima modifica: 25 Agosto 2015, 21:56:59 CEST da Dr.Joek »

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 665
  • Respect: +143
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Gestire un timer
« Risposta #1 il: 26 Agosto 2015, 11:31:58 CEST »
0
In Android le modifiche agli elementi dell'interfaccia possono essere effettuate solo all'interno dello UI Thread. Nel tuo codice avvii un task asincrono in un nuovo thread, dal quale tenti di modificare gli elementi dell'interfaccia generando un errore.

Ci sono due approcci:
- Dal thread parallelo richiedere l'esecuzione di un metodo all'interno dello UI-Thread
- Richiedere un'esecuzione posticipata all'interno dello UI-Thread (quindi senza istanziare nessun thread parallelo)

Soluzione 1:

Codice (Java): [Seleziona]
public class MioTask extends TimerTask {
    public void run() {
        svolgimento.this.runOnUiThread(new Runnable() { //Questo richiede l'esecuzione nello UI-Thread
            String relazione33;
            int numero1;
            int numero1tot;
            public void run() {
                //Tutto il codice che c'è nel tuo "public void run()"
            }
    });
}

Soluzione 2

Codice (Java): [Seleziona]
public class svolgimento extends Activity {
       
        public Handler myHandler = new Handler(); //Gestisce l'esecuzione di task nel thread corrente

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_svolgimento);
               
                MioTask myTask = new MioTask();
                myHandler.postDelayed(myTask, 1000); //Richiede l'avvio dopo un secondo
        }

        public class MioTask extends Runnable {
                //Nessun cambiamento, ma come ultima riga del metodo "run"
                //aggiungi "myHandler.postDelayed(this, 1000);"
                //in modo da ripetere ogni secondo
        }
}
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.