2012-04-06 12 views
0

Für ein paar Tage ein Problem haben. Ich muss einfach zeigen ProgressBar (nicht Dialog) während einige Sachen im Haupt-Thread ... Ich dachte, es ist eine sehr einfache Frage, aber ich kann das nicht tun, mir bitte helfen.Zeige Fortschrittsbalken in einem anderen Thread

Zuerst versuchte ich einfach setVisibility(View.VISIBLE) vor und setVisibility(View.GONE) nach.

Aber das ist in dem gleichen Thread, und ProgressBar eingefroren, während meine Funktion arbeitet.

Jetzt habe ich diesen Code, aber ich habe einige Fehler, und ich weiß nicht, was falsch ..

mein einfaches Layout:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 
<ProgressBar 
    android:id="@+id/loading" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:visibility="gone" /> 
</FrameLayout> 

Ich habe eine Basisaktivität:

public class BaseActivity extends Activity { 
    public ProgressBar loading; 

    public class ProgressBarShow extends AsyncTask<Void, Void, Void> { 
    protected Void doInBackground(Void... unused) { 
     return(null); 
    } 

    protected void onProgressUpdate() { 
    } 
    protected void onPreExecute() { 
     loading.setVisibility(View.VISIBLE); 
    } 

    protected void onPostExecute() { 
    } 
    } 
} 

und meine Arbeitstätigkeit schließlich, die BaseActivity

erweitert

Ich habe viele Aktivitäten, die Fortschrittsbalken benötigen, deshalb habe ich BaseActivity, erstellt, um Code nicht zu duplizieren.

Ich muss lange Arbeit (Stuff-Funktion) in Haupt-Thread, weil ich Hauptfenster einfrieren will und nicht Benutzer alles tun (klicken Sie auf Schaltfläche etc ..), nur arbeiten ProgressBar zeigen.

Was ist falsch in meinem Beispiel? Oder mir einen Rat geben, wie kann ich dies besser tun

+0

Wenn Sie die Interaktion des Benutzers mit der Anwendung blockieren wollen, warum Benutzt du nicht einfach einen Fortschrittsdialog? Ich empfehle Ihnen, den Fortschrittsdialog zu verwenden, weil er tut, was Sie wollen. – Cata

Antwort

2
class ProgressTask extends AsyncTask<Integer, Integer, Void>{ 
    ProgressBar progress; 
    Context context; 
    public ProgressTask(ProgressBar progress, Context context) { 
     this.progress = progress; 
     this.context = context; 

    } 
    @Override 
    protected void onPreExecute() { 
     // initialize the progress bar 
     // set maximum progress to 100. 
     progress.setMax(100); 

    } 


    @Override 
    protected Void doInBackground(Integer... params) { 
     // get the initial starting value 
     int start=params[0]; 


     // increment the progress 
     for(int i=start;i<=100;i+=5){ 
      try { 
       boolean cancelled=isCancelled(); 
       //if async task is not cancelled, update the progress 
       if(!cancelled){ 
        publishProgress(i); 
        SystemClock.sleep(1000); 

       } 

      } catch (Exception e) { 
       Log.e("Error", e.toString()); 
      } 

     } 
     return null; 
    } 
    //Has direct connection to UI Main thread 
    //Called everytime publishProgress(int) is called in doInBackground 
    @Override 
    protected void onProgressUpdate(Integer... values) { 
     progress.setProgress(values[0]); 
     Toast.makeText(context, "test"+values[0], Toast.LENGTH_SHORT).show(); 
    } 


    @Override 
    protected void onPostExecute(Void result) { 
     // async task finished 
        Log.v("Progress", "Finished"); 
    } 
    @Override 
    protected void onCancelled() { 
     progress.setMax(0); 
    } 
} 
+0

aber sein ProgressDialog, wie kann ich Sichtbarkeit von einfachen Fortschrittsbalken einstellen? – yital9

Verwandte Themen