2016-07-22 5 views
0

Ich arbeite an meiner ersten App und bin irgendwann steckengeblieben. In meinem MainActivity gibt es eine onClick Methode, die auf eine Schaltfläche in der Haupt Layout-Datei verknüpft ist:Ansicht auf einen Wartebildschirm umstellen

<Button 
    android:id="@+id/button" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:layout_centerHorizontal="true" 
    android:layout_below="@+id/IncludeAlbum" 
    android:text="@string/scan" 
    android:onClick="onClick" 
    /> 

Dies ist der onClick:

public void onClick(View view){ 

    view.setVisibility(view.GONE); 

    View v1 = (View) findViewById(id.Welcomemessage); 
    v1.setVisibility(v1.GONE); 

    // 
    // ... many more visibility changes 
    // 

    loaf = new ListOfAudioFiles(); // TAKES TIME 

    ListView lv = (ListView) findViewById(id.listView1); 
    adapter = new CustomAdapter(this, allComparisons); //loaf.songinfos 

    lv.setAdapter(adapter); 
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> adpterView, View view, int position, 
           long id) { 
      ListView lv = (ListView) findViewById(R.id.listView1); 

      long viewId = view.getId(); 

      if (viewId == R.id.textView1) { 
       allComparisons.get(position).togglecb1(); 
       adapter.notifyDataSetChanged(); 
      } else { 
       allComparisons.get(position).togglecb2(); 
       adapter.notifyDataSetChanged(); 
      } 

     } 
    }); 

} 

Nicht sehr sauber, ich weiß, aber Ich möchte die Struktur behalten. Der Konstruktor von listofaudiofiles macht viel Zeit.

Mein Problem ist, dass ich nicht die Ansicht auf einige warten kann Bildschirm vor dem Aufrufen des Konstruktors listofaudiofiles ändern, weder (Post) macht Arbeit ungültig noch setContentView auf ein neues Layout. Das Ändern der Ansicht durch setText gibt auch nichts. Nur wenn die Liste ausgefüllt ist, werden alle Änderungen der Ansicht angezeigt.

Wie kann ich Viewänderungen in onClick (...) vor dem Konstruktor Aufruf ListofAudioFiles erreichen, ohne meine Programmstruktur vollständig zu ändern?

+0

, die wahrscheinlich ist, weil Sie laufen Ihre Langlauf-Methode auf dem UI-Thread/Stellen Sie sicher, dass eine AsyncTask verwenden oder einen anderen Weg, um Ihren Betrieb des Drückens auf einen Arbeitnehmer Faden. – vkislicins

+0

Sie könnten dies nützlich finden: https://www.youtube.com/watch?v=0Z5MZ0jL2BM&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE&index=2 – vkislicins

Antwort

0

Sie können die Ansicht nicht in einen Wartebildschirm ändern, da Sie den Konstruktor auf dem UI-Thread ausführen.

Sie haben es vielleicht schon erraten, alles UI-bezogene ist im UIhread erledigt, einschließlich das Verschwinden einer Ansicht, das Ändern von Text usw. Wenn Sie den zeitaufwendigen Konstruktor aufrufen, wird der Konstruktor tatsächlich auf dem UI-Thread ausgeführt . Dies bedeutet, dass der UI-Thread gerade mit dem Laden Ihrer Audiodateien beschäftigt ist (was er nicht tun soll). Wie kann es möglicherweise die UI aktualisieren (was es tun soll)?

Als Ergebnis beendet der UI-Thread das Aktualisieren der Benutzeroberfläche, bis der zeitaufwändige Vorgang beendet ist. Für den Benutzer sieht das so aus, als wäre die App eingefroren.

Was können Sie also tun? Sie können entweder eine AsyncTask Unterklasse oder ein neues Thread Objekt erstellen. Ersteres ist zu empfehlen.

Die Methode onPostExecute in AsyncTask wird aufgerufen, wenn das Laden der Audiodateien beendet ist. Sie müssen diese Methode nur überschreiben, um zu wissen, wann der Vorgang beendet ist!

Sie können mehr über AsyncTask erfahren hier: https://developer.android.com/reference/android/os/AsyncTask.html