アンドロイドでprogressDialogを使用していますか?

私はこのコードを使って、正常に動作しているProgress Dialogを表示しています:

 dialog = ProgressDialog.show(this, "Please wait", 
 "Gathering Information...", true);
   Thread thread = new Thread()
    {
     @Override
        public void run() {
        if(Chapter_sync.size()>0){
        storemodule();

         c.open();
         for(int i=0;i

ここで私がしようとしているのは、すべての計算が完了するまでProgressダイアログを表示することです。 それが完了すると、私は再びすべてのビューを設定したかった。しかし、スレッドが開始する前にsetUpViews()が呼び出されます。私はスレッドの基本はあまりよくありません。なぜこのようなことが起こっているのか理解できたら助けてくれますか?

0

3 答え

問題は、ハンドラを使用していないことです。これを行うだけで、

dialog = ProgressDialog.show(this, "Please wait", 
 "Gathering Information...", true);
   Thread thread = new Thread()
    {
     @Override
        public void run() {
        if(Chapter_sync.size()>0){
        storemodule();

         c.open();
         for(int i=0;i

そして、onCreate()ハンドラを作成すると、

Handler handler=null;
handler=new Handler()
{
 public void handleMessage(Message msg)
{
 progressDialog.cancel();
  if(msg.what==0)
{
LinearLayout parentlayout=(LinearLayout)findViewById(R.id.chapterholder);
         parentlayout.removeAllViews();

         setUpViews();
};

バックグラウンドスレッドからUIを更新することはできません。 AsyncTaskを使用するか、バックグラウンドスレッドのハンドラを使用してメインスレッドにバックグラウンドアクションが完了したことを知らせる必要があります。

2
追加された
いつも歓迎...
追加された 著者 Andro Selva,
それはうまくいった!
追加された 著者 Navdroid,

あなたのコードで見れば

スレッドを開始した後は、スレッドが完了してビューをセットアップするのを待たずにメソッドsetUpViews()を呼び出しています。

あなたの情報を収集するスレッドでダイアログが閉じられたら、Handler.postを使用してください。

handler.post(new Runnable()
{
setUpViews();
});

したがって、操作が完了したら、ハンドラーによってsetupViewが呼び出されます。

0
追加された

スレッドスケジューリングは、オペレーティングシステムによって異なります。スレッドをインスタンス化しても、いつでもスレッドが確実に実行されるわけではありません。

あなたが直面している問題は、非同期タスクを使用して最適に処理できます。または、ダウンロードが完了したことを知らせるコールバックがある場合、コールバックでダイアログを閉じることができます。それを行うことでUIスレッド内で却下してください。

mActivity.runOnUiThread()または他のそのようなメソッド。

0
追加された