2016-10-14 3 views
0

Ich entwerfe einen funktionierenden Splashscreen, der meine App lädt, mit einer ProgressBar darauf.F: Aktualisieren einer ProgressBar mit echten Ergebnissen (enthält Code)

Gemäß der offiziellen Android-Entwickler-Dokumentation verwende ich eine Thread + Runnable, um meine Ladearbeiten zu erledigen, und richte die ProgressBar ein.

Alles in meinem Code unten stammt direkt aus der Android-Dokumentation.

Meine Fragen sind nach meinem Code unten ..

Hier ist meine aktuellen Code:

public class SplashActivity extends AppCompatActivity { 

private static final int PROGRESS = 0x1; 

private ProgressBar mProgress; 

private int mProgressStatus = 0; 

private Handler mHandler = new Handler(); 

@Override 
protected void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.activity_splash); 

    mProgress = (ProgressBar) findViewById(R.id.progressBar); 

    new Thread(new Runnable() { 
     public void run() { 
      while (mProgressStatus < 100) { 

       mProgressStatus = doWork(); 

       // Update the progress bar 
       mHandler.post(new Runnable() { 
        public void run() { 
         mProgress.setProgress(mProgressStatus); 
        } 
       }); 
      } 
     } 
    }).start(); 

} 
// Set up a method here to do my loading work called doWork? 
} 

Meine Fragen sind:

  • ich, dass der Kodex sehen ist Setzen Sie den Wert mProgressStatus auf doWork(). Ich würde annehmen, dass ich eine Methode verursachen muss, die doWork() genannt wird und meinen ganzen Code innerhalb es bezogen auf das Laden der APP einlege, und die ProgressBar wird entsprechend aktualisiert. Jedoch ist mProgressStatus ein int, also wie soll ich doWork() implementieren wie beabsichtigt?

  • Auch habe ich festgestellt, dass in den Deklarationen des Codes 10 nie verwendet wird - also soll ich das irgendwo einfügen?

  • Zuletzt, im Beispiel, onCreate verwendet Bundle icicle anstelle von savedInstanceState .. Ist das korrekt für meine Splash-Aktivität zu verwenden?

Antwort

1

I AsyncTask für diesen Zweck empfehlen würde, entnehmen Sie bitte unten Code

public class SplashActivity extends AppCompatActivity { 

private ProgressBar mProgress; 

@Override 
protected void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.activity_splash); 
    mProgress = (ProgressBar) findViewById(R.id.progressBar); 
    new DoWork().execute(this); 
} 
    protected class DoWork extends AsyncTask<Context, Integer, Void> { 
     @Override 
     protected String doInBackground(Context... params) { 
      //do some task say 20% of complete task 
       publishProgress(20); 
      //do some task say 50% of complete task 
     publishProgress(50); 
     //do some task say 100% of complete task 
     publishProgress(100); 
      return null; 
     } 

     //Called just before execution begins 
     @Override 
     protected void onPreExecute() { 
      Log.i("AsyncTask", "onPreExecute()"); 
     mProgress.show(); 
      super.onPreExecute(); 
     } 

     //called from the publish progress 
     @Override 
     protected void onProgressUpdate(Integer... values) { 
      super.onProgressUpdate(values); 
     mProgress.setProgress(values[0]);   
     } 

    // when execution is completed 
     @Override 
     protected void onPostExecute(Void param) { 
      super.onPostExecute(result); 
      mProgress.dismiss(); 
     } 
    } 
} 

EDIT

In Ihrem Weg es gerade nach vorn, doWork() ist technisch keine Methode. Sein der Ihre Hintergrundaufgabe in

@Override 
protected void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.activity_splash); 

    mProgress = (ProgressBar) findViewById(R.id.progressBar); 

    new Thread(new Runnable() { 
     public void run() { 
      while (mProgressStatus < 100) { // Show progress till its 100 
       //for example your downloading something, everytime you hit the while loop ,you'll update the mProgressStatus to current progress. 
       //I need to download file of size 10mb 
       //every time while loops execute , you calcluate size downloaded say 1mb i.e.. 1mb of 10mb means 10% progressed so set mProgressStatus to 10 
       int percentageOfFileDownloaded = (downloadedfileSize/TotalFileSize) * 100; //Just for example 
       mProgressStatus = percentageOfFileDownloaded; 
        //At one moment your entire file will be downloaded (10mb of 10mb) so update mProgressStatus to 100; it will break while loop. 
       // Update the progress bar 
       mHandler.post(new Runnable() { 
        public void run() { 
         mProgress.setProgress(mProgressStatus); 
        } 
       }); 
      } 
     } 
    }).start(); 

} 
} 
+0

inline als Ausführung Das Beispiel, das ich in meinem Code oben bin mit direkt von Google .. und es scheint viel einfacher als auch .. In jedem Fall wissen Sie, wie ich Kann das Beispiel machen, dass ich Arbeit gepostet habe? oder die Antworten auf die Fragen, die ich hatte? – StudioB

+0

@StudioB Ich habe für Ihr Szenario aktualisiert –

+0

Also, da ich einen großen Block Code ausführen muss, wie kann ich feststellen, wie viel davon abgeschlossen wurde? und wo würde ich es hinstellen? Weil mein Fall nicht so einfach ist wie "wie viel von einem Download gemacht wird", ist es komplizierter als das .. ..? – StudioB