Android: поток с прогрессбаром и setcurrentTab - PullRequest
0 голосов
/ 02 января 2012
   final ProgressDialog Pdialog = ProgressDialog.show(SpinnerClass.this, "", 
                        "Loading. Please wait...", true);
                Thread ProgressThread = new Thread() {
                    @Override
                    public void run() {
                        try {
                                     sleep(3000);   
                                     Pdialog.dismiss();

                        } catch(InterruptedException e) {
                            // do nothing
                        } finally {

                        }
                    }
                };
                ProgressThread.start();
                TabHost1 TabHost1Object2 = new TabHost1();
                TabHost1Object2.tabHost.setCurrentTab(2);

Проблема с этим потоком состоит в том, что он устанавливает текущую вкладку до начала диалога прогресса. Что я сделал не так ? Я хочу, чтобы диалог запускался и закрывался, и после завершения потока установите вкладку.

Ответы [ 2 ]

2 голосов
/ 02 января 2012

используйте AsyncTask для этого

некоторые подсказки:

public class BackgroundAsyncTask extends  AsyncTask<Void, Integer, Void> {  
    int myProgress;
    @Override
    protected void onPostExecute(Void result) {
    TabHost1 tab = new TabHost1();
    tab.tabHost.setCurrentTab(2);
    progressBar.dismiss();

    }
    @Override
    protected Void doInBackground(Void... params) {   
        while(myProgress<100){
            myProgress++;
            publishProgress(myProgress);
            SystemClock.sleep(100);
        }
        return null;
    }

    @Override
    protected void onProgressUpdate(Integer p) {   
        progressBar.setProgress(p);
    }

}
0 голосов
/ 03 января 2012

Дело в том, что вы запускаете поток, который не повлияет на ваш основной интерфейс. Так что в конечном итоге происходит то, что ваш поток будет работать отдельно, что теперь позволит выполнять следующие строки вашего кода. Так что в вашем случае

            TabHost1 TabHost1Object2 = new TabHost1();
            TabHost1Object2.tabHost.setCurrentTab(2);

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

Сделайте это в вашем onCreate ()

           Handler handler;
    handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 0) {
         Pdialog.dismiss();     
             TabHost1 TabHost1Object2 = new TabHost1();
            TabHost1Object2.tabHost.setCurrentTab(2);

         }
       };

А теперь в вашей ветке, вызовите обработчик вот так:

  final ProgressDialog Pdialog = ProgressDialog.show(SpinnerClass.this, "", 
                    "Loading. Please wait...", true);
            Thread ProgressThread = new Thread() {
                @Override
                public void run() {
                    try {
                                 sleep(3000);   


                    } catch(InterruptedException e) {
                        // do nothing
                    } finally {

                             handler.sendEmptyMessage(0);
                    }
                }
            };
this will allow your tabhost to wait until the thread gets executed and will come into view after thread finishes execution. 
...