1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Button Click

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Peter123, 19.12.2011.

  1. Peter123, 19.12.2011 #1
    Peter123

    Peter123 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    103
    Erhaltene Danke:
    7
    Registriert seit:
    13.11.2010
    Also ich möchte, wenn auf einen Button geklickt wird, dass eine Sekunde gewartet wird, dann das Hintergrundbild geändert wird, wieder eine Sekunde gewartet wird und nochmals das Bild geändert wird.

    Habe mir das so gedacht, dass folgende Methode aufgerufen wird, wenn der Button geklickt wird:

    Code:
    public void aendern(){
        	
        	new Thread(new Runnable() {
        	    public void run() {
        	      try {
    				Thread.sleep(1000);
    			} catch (InterruptedException e) {}
    			
    			layout.setBackgroundDrawable(getResources().getDrawable(R.drawable.p1));
    			
    			try {
    				Thread.sleep(1000);
    			} catch (InterruptedException e) {}
    			
    			layout.setBackgroundDrawable(getResources().getDrawable(R.drawable.p2));
    			
    			
        	    }
        	  }).start();
        	
        }
    Das Ganze funktioniert jedoch nicht und ich bekomme folgenden Fehler...:

    android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.


    Wie kann ich das Ganze besser lösen?
     
  2. swordi, 19.12.2011 #2
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    Stichworte sind:

    UI Thread, Handler, AsyncTask

    damit hast du alles was du brauchst
     
  3. strider, 19.12.2011 #3
    strider

    strider Erfahrener Benutzer

    Beiträge:
    208
    Erhaltene Danke:
    45
    Registriert seit:
    30.09.2011
    Phone:
    Nexus S
    Entweder so oder einfach mit dem ViewFlipper.
     
  4. swordi, 19.12.2011 #4
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    aber deine antwort wird ihm nicht weiterhelfen.

    dann schaltet er die seite im thread um und bekommt genau den gleichen fehler...
     
  5. Peter123, 19.12.2011 #5
    Peter123

    Peter123 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    103
    Erhaltene Danke:
    7
    Registriert seit:
    13.11.2010
    Müsste das Ganze dann per AsyncTask so aussehen?

    Code:
       class aendern1 extends AsyncTask {
        	   
    
        	 
        	               protected void onPostExecute() {
                                layout.setBackgroundDrawable(getResources().getDrawable(R.drawable.p1));        
        	               }
    
    			@Override
    			protected Object doInBackground(Object... params) {
    				// TODO Auto-generated method stub
    				 try {
    	    	            Thread.sleep(1000);
    	    	        } catch (InterruptedException e) {
    	    	            e.printStackTrace();
    	    	        }
    				return null;
    			}
        	}
    
        
        class aendern2 extends AsyncTask {
     	   
    
    	    protected void onPostExecute() {
                       layout.setBackgroundDrawable(getResources().getDrawable(R.drawable.p2)); 
    	    }
    
    		@Override
    		protected Object doInBackground(Object... params) {
    			// TODO Auto-generated method stub
    			 try {
        	            Thread.sleep(1000);  
        	        } catch (InterruptedException e) {
        	            e.printStackTrace();
        	        }
    			return null;
    		}
    	}
    Und dann beim Klicken:

    Code:
    new aendern1().execute();
    new aendern2().execute();

    So passiert nämlich gar nichts.
     
  6. swordi, 19.12.2011 #6
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    die tasks sehen schonmal ganz gut aus

    du rufst aber einfach beide tasks nacheinander auf und wartest jeweils 1 sek. von daher ist die gesamt zeit genau 1 sek

    rum mal task 2 im onPostExecute auf, dann wirds besser werden.

    btw: informier dich mal nach Java coding standards. das machts für dich und für uns einfacher
     
  7. Peter123, 19.12.2011 #7
    Peter123

    Peter123 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    103
    Erhaltene Danke:
    7
    Registriert seit:
    13.11.2010
    Da immer noch nichts passiert ist, habe ich mal das Ändern des Backgrounds in die
    doInBackground(Object... params){}
    Methode geschrieben.
    Infolgedessen bekam ich wieder folgenden Fehler:

    Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

    Edit: Habe gerade gesehen, dass das auch so seine Richtigkeit hat.
    Aber ich frage mich dennoch, warum das Bild nicht geändert wird...

    Edit2: Habe es doch hinbekommen...Lag wohl irgendwie alles an der Parameterübergabe.
     
    Zuletzt bearbeitet: 19.12.2011

Diese Seite empfehlen