2012-01-02 3 views
0
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); 

Проблема с этим потоком заключается в том, что он устанавливает текущую вкладку перед запуском диалогового окна прогресса. Что я сделал не так ? Я хочу, чтобы диалог запускался и увольнялся, а после того, как поток сделан, установите вкладку.Android: Thread with progressBar и setcurrentTab

ответ

0

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

  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. 
+0

. Хорошо, спасибо за помощь. – Hello

2

использование 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); 
    } 

} 
+1

+1 согласен с этим. –

+0

Главный заголовок был пропущен. За это. Я имел в виду ProgressDialog not ProgressBar. Так ли это для этого? – Hello

+0

Да, это то же самое для 'ProgressDialog', вам нужно реализовать' onPreExecute() ', чтобы показать' ProgressDialog' –