2012-04-10 10 views
0

上の非常に奇妙な行動私はアンドロように私のコードを更新しましたが、私に書いた:アンドロイド - プログレスバー

public class ZiiziiActivity extends Activity { 
    ProgressDialog pd; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     pd = new ProgressDialog(ZiiziiActivity.this); 
     final Handler handler = new Handler() 
     { 
      public void handleMessage(Message msg) 
      { 
       if(msg.what==0) 
       { 
        pd.dismiss(); 
       } 
      } 
     }; 

     Button end = (Button) findViewById(R.id.button2); 
     end.setOnClickListener(new View.OnClickListener() 
     { 
      public void onClick(View v) 
      { 
       pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
       pd.setMessage("Working..."); 
       pd.setIndeterminate(true); 
       pd.setCancelable(false); 
       pd.show(); 
       Thread t = new Thread(new Runnable() { 
        @Override 
        public void run() { 
         for (int i=0;i<1000000;i++) 
         { 
          try { 
           Thread.sleep(100); 
          } catch (InterruptedException e) { 
           // TODO Auto-generated catch block 
           e.printStackTrace(); 
          } //To denote a delay in background processing 
         } 
         handler.sendEmptyMessage(0); 
        } 
       }); t.start(); 
      } 
     }); 
    } 
} 

しかし、進行開始を、それは決して終わりません。

何が間違っていますか?

+0

forループの制限を減らします。私のような何か<10 ..とチェック –

+0

ありがとう!!!!その作品!!!! – Gold

+0

ループの代わりに私の関数を呼び出そうとしています - for(i ......)とエラーが発生しました:java.lang.RuntimeException:Looper.prepare()を呼び出さなかったスレッド内でハンドラを作成できません – Gold

答えて

1

これは簡単です。この背後にある基本的な事実は次のとおりです。

進行状況ダイアログはメインUIで実行されます。ここのforループはすぐに実行され、優先順位が高くなり、進行状況ダイアログが表示されませんが、実際にコードが正常に動作し、人間の目が捕捉できない秒数分。

通常、スレッドがメインスレッドではなくバックグラウンドスレッドで何かを実行すると、進行状況ダイアログが表示されます。だからあなたは少しコードを変更する必要があります。彼らは、

1)は、このようなスレッドを使用してforループを囲み、ある

Button end = (Button) findViewById(R.id.button2); 
    end.setOnClickListener(new View.OnClickListener() 
    { 
     public void onClick(View v) 
     { 
      ProgressDialog pd = new ProgressDialog(ZiiziiActivity.this); 
      pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
      pd.setMessage("Working..."); 
      pd.setIndeterminate(true); 
      pd.setCancelable(false); 
      pd.show(); 
      Thread t = new Thread(new Runnable() { 
       @Override 
       public void run() { 
        for (int i=0;i<1000000;i++) 
        { 
         Thread.sleep(100); //To denote a delay in background processing 
        } 
        handler.sendEmptyMessage(0); 
       } 
      }); 
      t.start(); 
     } 
    }); 

2)今、このようなあなたのonCreate()にハンドラを追加します。

handler = new Handler() 
    { 
     public void handleMessage(Message msg) 
     { 
      if (msg.what == 0) 
      { 
       pd.dismiss(); 
      } 
     }; 

なお、あなたをバックグラウンドスレッドからUIを更新することはできません。したがって、他のワーカースレッドからUIを更新するには、ハンドラのために移動します。だからあなたのforループが完了すると、UIを更新するハンドラーへの呼び出しが行われます。 (この場合、進捗ダイアログはキャンセルされます)。

+0

助けてくれてありがとう、私の更新を見てください – Gold

+0

ありがとう!!!その作品!!!! – Gold

1

コードは以下のコードと同じです。

pd.show(); 
pd.dismiss(); 

呼び出されますが、あなたのforループは一度にすべてのcomsumingではないので、すぐにダイアログが却下されます。show方法また、UIをブロックしています。したがって、時間のかかる操作で空のforループを置き換えると、UIスレッドをブロックするため、進捗状況が実行されません。

+0

私は同様の問題に直面している、どのようにそれを解決することができますか? – Gali

+0

時間のかかる操作をバックグラウンドスレッドに入れます。主に2つのアプローチがある。まず、Androまたはより簡単な使い方である 'AsyncTask'で' Handler'を説明します。 – 207

関連する問題