2012-04-10 20 views
0

我更新了我的代碼像穿心蓮內酯寫對我很奇怪的現象:Android的 - 對進度

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

減少循環的限制。像我<10 ..和檢查 – 2012-04-11 10:33:33

+0

謝謝!其作品 !!!! – Gold 2012-04-11 14:23:45

+0

我嘗試調用我的函數而不是循環 - 爲(我......)和我得到錯誤:java.lang.RuntimeException:無法創建處理程序內部沒有調用Looper.prepare() – Gold 2012-04-11 17:35:40

回答

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,您需要處理程序。因此,一旦您的for循環完成,就會對更新UI的處理程序進行調用。 (在這種情況下,它取消進度對話框)。

+0

感謝您的幫助,請參閱我的更新請 – Gold 2012-04-11 10:30:55

+0

謝謝!其作品 !!!! – Gold 2012-04-11 14:24:16

1

您的代碼與您執行以下操作相同。

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

show被調用的方法,但是立即對話框被駁回,因爲你for循環不是時花費時間的。另外,您正在阻止用戶界面。因此,如果您通過耗時的操作替換空的for循環,您的進度將無法運行,因爲您阻止了UI線程。

+0

我面臨着類似的問題,該如何解決呢? – Gali 2012-04-11 05:17:39

+0

在後臺線程中放置耗時的操作。主要有兩種方法。首先是由Andro描述的'Handler'或更簡單的使用'AsyncTask' – 207 2012-04-11 10:22:20