2010-09-07 2 views
11

Es wäre schön, wenn die ProgressBar gemacht werden könnte, bis sie gebraucht wird. Gibt es ein Problem mit setVisibility.progressBar in applyMenuChoice? Das Problem bei der Verwendung von setVisibility.progressBar in PrintStatusTask(). Execute() besteht darin, dass die App während der Laufzeit abstürzt.Warum funktioniert setVisibility nicht auf Android ProgressBar?

public class Controller extends Activity { 
    private ProgressBar progressBar; 
    ... 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.controller); 
     progressBar = (ProgressBar)findViewById(R.id.progressBar); 
     ... 

    private boolean applyMenuChoice(MenuItem item) { 
     switch (item.getItemId()) { 
     case R.id.menuStatus: 
      progressBar.setVisibility(View.VISIBLE); 
      new PrintStatusTask().execute(); 
      progressBar.setVisibility(View.GONE); 
      ... 

Antwort

19
progressBar.setVisibility(View.VISIBLE); 
new PrintStatusTask().execute(); 
progressBar.setVisibility(View.GONE); 

Dies ist, was Sie tun: 1. Zeigen Sie der progressBar 2. Spawn eine Aufgabe auf einem separaten Thread 3. ausblenden die progressBar

Dieser gesamte Prozess dauern wird, nicht mehr als ein paar Millisekunden zur Ausführung. Sie müssen den Fortschrittsbalken in der onPostExecute()-Methode der PrintStatusTask-Klasse ausblenden.

Sie müssen verstehen, dass die execute() Methode von AsyncTask ein Aufruf ist, der einen anderen Thread ausführt und nicht darauf wartet, dass es beendet wird. Das ist der Sinn von AsyncTask.

+0

Verstanden. Vielen Dank. Das war's. Ich musste auch die setVisibility (View.VISIBLE) in die onPreExecute() setzen. blah! – jacknad

+0

Ist progressBar.setVisibility (View.GONE); der beste Weg, um eine Fortschrittsbalken zu entfernen? Ich hoffe, dass Animation in diesem Fall aufhört und Leistung nicht isst ... – OneWorld

4

Versuchen Sie, die ProgressBar in der AsyncTask zu verbergen? Wenn ja, muss es in onPreExecute oder onPostExecute (wie alle UI-Befehle) erfolgen.

Verwenden Sie auch so etwas wie dieses:

private void toggleProgressBar() { 
    switch (progressBar.getVisibility()) { 
    case View.GONE: 
     progressBar.setVisibility(View.VISIBLE); 
     break; 
    default: 
     progressBar.setVisibility(View.GONE); 
     break; 
    } 
}