2012-07-30 16 views
0

我有一個類延伸Activity這個類的工作是從手機上的SQLite數據庫和init獲取一些數據。一個ListView與來自數據庫的所有數據。當用戶觸發活動開始時(按下按鈕)顯示進度對話框

這是從數據庫中獲取信息的方法:

public ArrayList<Case> getFromDatabase() { 

    ArrayList<Case> c = db1.getAllContacts();  
    return c; 
} 

正如前面提到的這個方法是一個擴展Activity這種方法被稱爲在onCreate方法的類裏面。如果數據庫包含大約15條記錄,則該操作大約需要2秒。當用戶按下按鈕啓動此活動時,如何顯示ProgressDialog,以顯示發生了什麼?

回答

1

創建ProgressDialog如通過聲明onCreate方法之外的ProgressDialog變量的活動領域:

ProgressDialog pd=null; 

以下onCreate方法之外塊創建一個處理程序中Activty場,通過寫入。

Handler handler=new Handler() 
{ 
    public void handleMessage(Message msg) 
    { 
     pd.dismiss(); 
     //do other operations on EventThread. 
     ArrayList<Case> c= (ArrayList<Case>)msg.obj; 
     //Process c 
    } 
} 

現在onCreate方法與下面的代碼替換代碼:

pd=ProgressDialog.show(YourActivity.this, "title", "subtitle"); 
Thread thread=new Thread() 
{ 
    public void run() 
    { 
     ArrayList<Case> c = db1.getAllContacts(); 
     Message msg=handler.obtainMessage(); 
     msg.obj=c; 
     handler.sendMessage(msg); 
    } 
}; 
thread.start(); 
+0

請記住,從數據庫獲取數據的方法必須返回ArrayList,這在本例中是不可能的。 – 2012-07-30 11:24:05

+1

這是可能的,請參閱我編輯的答案。 – jeet 2012-07-30 11:27:36

+0

非常感謝! :) – 2012-07-30 12:04:45

1

我建議你將你的數據庫包裝在一個ContentProvider中,然後使用一個CursorLoader來爲ListActivity提供動力。這將避免捆綁您的UI線程,避免需要進度條,在數據庫內容發生變化時處理更新列表等等。 (如果您只想從設備獲取聯繫人,則已有Contacts Content Provider。)

0

使用AsyncTask顯示ProgressDialog並在後臺獲取數據。

new FetchRSSFeeds().execute(); 

然後創建類

private class FetchRSSFeeds extends AsyncTask<String, Void, Boolean> { 

private ProgressDialog dialog = new ProgressDialog(HomeActivity.this); 

    /** progress dialog to show user that the backup is processing. */ 
    /** application context. */ 

    protected void onPreExecute() { 
     this.dialog.setMessage("Please wait"); 
     this.dialog.show(); 
    } 

    protected Boolean doInBackground(final String... args) { 
     try { 

      /** 
      * Fetch the data 
      */ 
      Utilities.arrayRSS = objRSSFeed.FetchRSSFeeds(Constants.Feed_URL); 
      return true; 
     } catch (Exception e) { 
      Log.e("tag", "error", e); 
      return false; 
     } 
    } 

    @Override 
    protected void onPostExecute(final Boolean success) { 

     if (dialog.isShowing()) { 
      dialog.dismiss(); 
     } 

      // Setting data to list adaptar 
      setListData(); 
      txtTitle.setText(Utilities.RSSTitle); 
    } 
} 
+0

這不是我想這樣做的方式。 Iam熟悉AsyncTask,但這不會解決我的問題。不管怎麼說,還是要謝謝你。 – 2012-07-30 11:18:07

0

使用AsyncTask。這門課提供解決你面臨的問題的方法。

首先,在onPreExecute()方法,你可以開始ProgressDialog(你這裏寫的代碼,將創建AsyncTask對象的線程上執行,即在你的情況下,UI線程)

然後,在doInBackground()方法您從數據庫加載您的數據。

最後,在onPostExecute()方法中,您從後臺線程獲得結果,因此您可以忽略ProgressDialog,因爲您再次處於UI線程中。

可以找到更多的信息here

相關問題