2016-10-14 8 views
0

Я разрабатываю функциональный Splashscreen, который загружает мое приложение, с ним на нем находится ProgressBar.Q: Обновление ProgressBar с реальными результатами (включая код)

Согласно официальной документации разработчиков Android, я использую Thread + Runnable для выполнения моих загрузочных работ и настройки ProgressBar.

Все, что находится внутри моего кода, приведено непосредственно в документации для Android.

Мои вопросы после того, как мой код ниже ..

Вот мой текущий код:

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? 
} 

Мои вопросы:

  • Я вижу, что Кодекс установив mProgressStatus равным doWork(). Я бы предположил, что мне нужно создать метод под названием doWork() и поместить весь его код внутри него, связанный с загрузкой приложения, и ProgressBar будет соответствующим образом обновлен. Однако mProgressStatus - это int, так как я должен реализовать doWork() как предполагалось?

  • Кроме того, я заметил, что в объявлениях кода private static final int PROGRESS = 0x1; никогда не используется - так я должен вставить это где-нибудь?

  • Наконец, в примере onCreate использует Bundle icicle вместо savedInstanceState .. Это правильно для использования моей активности Splash?

ответ

1

Я бы порекомендовал AsyncTask для этой цели, пожалуйста, обратитесь ниже код

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

В пути он прямо вперед, DoWork() технически не метод. Его фоновая задача вашего выполнения рядный как в

@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

В примере я использую в моем коде выше непосредственно от Google .. и это кажется намного более простым, а .. В любом случае, вы знаете, как я может сделать пример, который я опубликовал? или ответы на вопросы, которые у меня были? – StudioB

+0

@StudioB Я обновил для своего сценария –

+0

Так как у меня есть большой блок кода для выполнения, как я могу определить, сколько его было выполнено? и где бы я это сказал? Потому что мой случай не так прост, как «сколько будет сделана загрузка», тем сложнее, чем это ... ..? – StudioB