Autore Topic: AVVIO THREAD  (Letto 612 volte)

Offline bomberdini

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: 0
    • Mostra profilo
AVVIO THREAD
« il: 22 Aprile 2012, 16:38:01 CEST »
0
Salve a tutti stavo provando un semplice esercizio con i thread ossia: quando premo un bottone se il bottone è verde faccio partire il thread. il codice che ho scritto è il seguente:

il main xml è il seguente
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:orientation="vertical" >





     <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="86dp"
        android:orientation="horizontal" >
         

         <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="50dp"
            android:text=" ffffffffffffffff" />
         

        <Button
           android:id="@+id/bc1"
           android:layout_width="250dp"
           android:layout_height="wrap_content"
           android:layout_gravity="center"
           android:text="bottone1"
           android:textSize="20dp"
           android:textColor="#00FF00"
         
            />
       
    </LinearLayout>


    <LinearLayout
       android:layout_width="fill_parent"
       android:layout_height="78dp"
       android:orientation="horizontal" >


        <TextView
           android:id="@+id/textView2"
           android:layout_width="wrap_content"
           android:layout_height="57dp"
           android:text=" ffffffffffffffff" />

        <Button
           android:id="@+id/bc2"
           android:layout_width="46dp"
           android:layout_height="wrap_content"
           android:layout_gravity="center"
           android:layout_weight="0.40"
           android:text="bottone2"
           android:textColor="#FF0000"
           android:textSize="20dp" />
    </LinearLayout>

</LinearLayout>


mentre il codice java è il seguente
Codice (Java): [Seleziona]
package com.btnthread.dinardo;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class BottoniThreadActivity extends Activity {
    /** Called when the activity is first created. */
       
         int contatoretv1;
     int contatoretv2;
     TextView display1,display2;
        Button btn1,btn2;
       
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
       contatoretv1=0;
       contatoretv2=0;
       btn1 = (Button) findViewById(R.id.bc1);
       btn2 = (Button) findViewById(R.id.bc2);
       display1 = (TextView) findViewById(R.id.textView1);
       display2 = (TextView) findViewById(R.id.textView2);
       
       //mi metto in ascolto del primo bottone
        btn1.setOnClickListener(new View.OnClickListener() {
                       
                        @Override
                        public void onClick(View arg0) {
                               
                                //se il bottone è rosso lo faccio diventare verde
                                if(btn1.getCurrentTextColor()==(Color.RED)){
                        btn1.setTextColor(Color.GREEN);
                                }
                                else{
                                        //il bottone è verde e lo faccio diventare rosso
                                        btn1.setTextColor(Color.RED);
                                }
                        //e faccio partire il thread
                        while(btn1.getCurrentTextColor()==Color.GREEN){
                        new Thread(new Runnable() {
                        public void run() {
                           display1.setText("contatore 1 :"+contatoretv1);
                           try {
                                                        Thread.sleep(1000);
                                                        contatoretv1++;
                                                } catch (InterruptedException e) {
                                                        // TODO Auto-generated catch block
                                                        e.printStackTrace();
                                                }
                        }
                    }).start();
                        }
                                       
                       
                               
                        }
                });
       
        //mi metto in ascolto del secondo bottone
        btn2.setOnClickListener(new View.OnClickListener() {
                       
                        @Override
                        public void onClick(View arg0) {
                                // TODO Auto-generated method stub
                               
                                //se il bottone è rosso lo faccio diventare verde
                                if(btn2.getCurrentTextColor()==(Color.RED)){
                        btn2.setTextColor(Color.GREEN);
                        btn1.setTextColor(Color.RED);
                                }
                                else{
                                        //il bottone è verde e lo faccio diventare rosso
                                        btn2.setTextColor(Color.RED);
                                        btn1.setTextColor(Color.GREEN);
                                }
                               
                        }
                });
             
       
                         
    }
}

praticamente il thread dovrebbe scrivere ogni secondo il valore del contatore. Ringrazio anticipatamente tutti per l'aiuto :)

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:AVVIO THREAD
« Risposta #1 il: 22 Aprile 2012, 16:50:10 CEST »
0
Non dici qual'è il problema, ma immagino sia un Force Close, perchè stai cercando di modificare un elemento della UI da un thread che non sia quello principale (cosa non permessa in Android).

Ti consiglio di dare una lettura a queso tutorial, che dovrebbe suggerirti come modificare il tuo esempio:
[medio] Introduzione ai Thread - Android Developers Italia
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline bomberdini

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: 0
    • Mostra profilo
Re:AVVIO THREAD
« Risposta #2 il: 22 Aprile 2012, 16:58:29 CEST »
0
il file di log è il seguente :


04-22 14:26:13.417: ERROR/AndroidRuntime(632): FATAL EXCEPTION: Thread-9
04-22 14:26:13.417: ERROR/AndroidRuntime(632): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
04-22 14:26:13.417: ERROR/AndroidRuntime(632):     at android.view.ViewRoot.checkThread(ViewRoot.java:2802)
04-22 14:26:13.417: ERROR/AndroidRuntime(632):     at android.view.ViewRoot.requestLayout(ViewRoot.java:594)
04-22 14:26:13.417: ERROR/AndroidRuntime(632):     at android.view.View.requestLayout(View.java:8125)
04-22 14:26:13.417: ERROR/AndroidRuntime(632):     at android.view.View.requestLayout(View.java:8125)
04-22 14:26:13.417: ERROR/AndroidRuntime(632):     at android.view.View.requestLayout(View.java:8125)
04-22 14:26:13.417: ERROR/AndroidRuntime(632):     at android.view.View.requestLayout(View.java:8125)
04-22 14:26:13.417: ERROR/AndroidRuntime(632):     at android.view.View.requestLayout(View.java:8125)
04-22 14:26:13.417: ERROR/AndroidRuntime(632):     at android.view.View.requestLayout(View.java:8125)
04-22 14:26:13.417: ERROR/AndroidRuntime(632):     at android.widget.TextView.checkForRelayout(TextView.java:5378)
04-22 14:26:13.417: ERROR/AndroidRuntime(632):     at android.widget.TextView.setText(TextView.java:2688)
04-22 14:26:13.417: ERROR/AndroidRuntime(632):     at android.widget.TextView.setText(TextView.java:2556)
04-22 14:26:13.417: ERROR/AndroidRuntime(632):     at android.widget.TextView.setText(TextView.java:2531)
04-22 14:26:13.417: ERROR/AndroidRuntime(632):     at com.btnthread.dinardo.BottoniThreadActivity$1$1.run(BottoniThreadActivity.java:48)
04-22 14:26:13.417: ERROR/AndroidRuntime(632):     at java.lang.Thread.run(Thread.java:1096)

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:AVVIO THREAD
« Risposta #3 il: 22 Aprile 2012, 17:15:20 CEST »
0
Codice: [Seleziona]
...
04-22 14:26:13.417: ERROR/AndroidRuntime(632): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
...

Questa riga conferma quanto ho scritto prima: non puoi toccare la UI da un thread che non sia il principale. Come ti avevo accennato prima è una delle domande più frequenti riguardo i thread in Android, dai un'occhiata al tutorial per maggiori info.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline bomberdini

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: 0
    • Mostra profilo
Re:AVVIO THREAD
« Risposta #4 il: 22 Aprile 2012, 17:23:14 CEST »
0
ho dato una letta a quel topic però vorrei chiederti una cosa. in quel topic si creava un nuovo thread che scriveva solo un messaggio. Poichè il mio caso è di creare un thread che se premuto un bottone vada a modificare i dati di un textView la soluzione che mi è venuta in mente è : se il bottone è verde devo attivare il thread metto il thread all'interno del bottone. Poiche sono alle prime armi con android è l'unica soluzione che mi viene in mente e non capisco dove sia il problema. Potresti spiegarmelo in parole povere? ti ringazio ;)

cribcaged

  • Visitatore
Re:AVVIO THREAD
« Risposta #5 il: 22 Aprile 2012, 17:28:01 CEST »
0
ho dato una letta a quel topic però vorrei chiederti una cosa. in quel topic si creava un nuovo thread che scriveva solo un messaggio. Poichè il mio caso è di creare un thread che se premuto un bottone vada a modificare i dati di un textView la soluzione che mi è venuta in mente è : se il bottone è verde devo attivare il thread metto il thread all'interno del bottone. Poiche sono alle prime armi con android è l'unica soluzione che mi viene in mente e non capisco dove sia il problema. Potresti spiegarmelo in parole povere? ti ringazio ;)

io non riesco a capire bene l'obiettivo che ti sei posto...ad ogni modo non puoi aggiornare la UI dal thread, potresti provare ad usare l'asyncTask che ha dei metodi
in cui puoi aggiornare la UI durante e alla fine del lavoro in background.

Però ribadisco che non ho capito cosa devi fare in background!

Offline bomberdini

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: 0
    • Mostra profilo
Re:AVVIO THREAD
« Risposta #6 il: 22 Aprile 2012, 17:31:28 CEST »
0
probabilmente sono stato poco chiaro io e mi scuso. Comunque quello che vorrei fare in poche parole è la seguente cosa. quando ho il bottone verde voglio scrivere nel corrispettivo textView il valore di un contatore ogni 1000 ms. Quando il bottone è rosso non voglio fare niente.