2013-04-17 60 views
0

我想在android中創建進度對話框,將其保持打開狀態2秒鐘,然後關閉它。無法關閉Android中的進度對話框

下面是我寫的代碼:

package com.example.proressdialogtest; 

import android.app.activity; 
import android.app.ProgressDialog; 
import android.os.bundle; 

public class MainActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     ProgressDialog pg = new ProgressDialog(MainActivity.this, 4); 

     pg.show(MainActivity.this, null, "Searching...", false); 

     try { 
      Thread.sleep(2000); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     pg.dismiss(); 
} 

當我運行我的設備上的代碼,該ProgressDialog被打開,然後將其保持打開狀態,不會關閉後2秒。我究竟做錯了什麼?


根據以下答案。我分別在doInBackground方法之前和之後添加了onPreExecute()和onPostExecute()方法。

這是兩種方法的代碼。

ProgressDialog pd; 

public void onPreExceute() { 
    pd = new ProgressDialog(MainActivity.this); 
    pd.show(MainActivity.this, "", "Searching...", false); 
} 

public void onPostExecute() { 
    pd.dismiss(); 
} 

問題仍然存在。進度條不會關閉。

回答

3

您正在致電sleep()UI Thread。不要這樣做。使用runOnUiThreadAsyncTask

Painless Threading

AsyncTask

我會用一個AsyncTask。您將在onPreExecute()中啓動ProgressDialog,然後在onPostExecute()中關閉它。這是doInBackground()所以使用它UI元素會給你錯誤

This SO answer has a good example of using it

+0

我已經在計劃中的異步任務,我正在使用,它有一個受保護的布爾doInBackground(Integer ... params)方法。我已經嘗試在doInBackground函數中執行上述操作,但發生了相同的錯誤。 – aagarwal

+0

我編輯了我的答案 – codeMagic

+0

我編輯了這個問題。 – aagarwal

1

編輯:

使用此代碼

public class MainActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     final ProgressDialog pg ; 

     pg = ProgressDialog.show(MainActivity.this, null, "Searching...", false); 

     Thread timer=new Thread(){ 
      public void run() 
      { 
       try { 
        sleep(2000); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       finally{ 
        pg.dismiss(); 
       } 
      } 

     }; 
     timer.start(); 
} 
} 

你暫停UI線程通過調用

Thread.sleep(2000); 

因爲了Thread.sleep(X)將用於X毫秒的

這是壞事當前線程睡眠。

地方

我不知道爲什麼

pg.dismiss()在finally塊,以確保進度對話框將被關閉。

,也是你的代碼將無法運行,因爲你已經錯過了

super.onCreate(savedInstanceState); 
+0

我錯過了super.onCreate(savedInstanceState);在問題中,它始終存在於原始代碼中。我最後添加了這一行{pg.dismiss(); }在try/catch語句之後。但問題依然存在。 – aagarwal

+0

@aagarwal嘗試上面的代碼,它會爲你工作 – Pragnani

0

下面的代碼會爲你工作,

new AsyncTask<Integer, Integer, Boolean>() 
      { 
       ProgressDialog progressDialog = null; 

       @Override 
       protected void onPreExecute() 
       {       
        progressDialog = ProgressDialog.show(MainActivity.this, "", 
          "Loading..."); 
       } 

       @Override 
       protected Boolean doInBackground(Integer... params) 
       { 
        if (params == null) 
        { 
         return false; 
        } 
        try 
        { 

         Thread.sleep(2000); 

        } 
        catch (Exception e) 
        { 

         return false; 
        } 

        return true; 
       } 

       @Override 
       protected void onPostExecute(Boolean result) 
       { 
        progressDialog.dismiss();       

       } 
      }.execute(); 
+0

代碼只有答案一般在所以不贊成:(它的好成員知道爲什麼代碼將工作,以便他們可以幫助自己後來 – codeMagic

+0

這完美的作品,但它的與codeMagic示例中的代碼相同,所以我將支票交給了他。 – aagarwal