2012-08-17 57 views
1

我在SDCard上有一個龐大的數據庫(40MB)。我需要提取數據,在查詢中使用LIKE,這非常緩慢。ProgressDialog沒有在AsyncTask中顯示

數據庫請求大約需要5秒鐘。因此,我需要異步執行並使用ProgressDialog

我試過用AsyncTask,但是問題出在ProgressDialog
它是這樣實現:

private class GetDataFromLangDB extends AsyncTask<String, String, String> { 

    private final ProgressDialog dialog = new ProgressDialog(TranslAndActivity.this); 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

     urDBCursor.close(); 
     curDBCursor = null; 
     scaAdapter = null; 

     this.dialog.setMessage("Loading data..."); 
     this.dialog.show(); 

    } 

    @Override 
    protected String doInBackground(String... whatSearch) { 
     String result = ""; 

     if (myDatabaseAdapter != null) { 
      curDBCursor = myDatabaseAdapter.fetchAll(whatSearch[0]); 
     } 
     return result; 
    } 

    @Override 
     protected void onPostExecute(String result) { 
      super.onPostExecute(result); 

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

      prepareListView(); 
    } 
} 

的問題是,ProgressDialog沒有數據庫請求過程中。 完成數據庫查詢後,它在屏幕上短暫閃爍。當用戶在數據庫請求期間嘗試使用 點擊屏幕時,UI會凍結,並且在DB請求 顯示「無響應」消息。

我有一個線程試圖這樣說:

public void startProgress(View view, final String aWhatSearch) { 

     final ProgressDialog dialog = new ProgressDialog(MyActivity.this); 
     if (curDBCursor != null){ 
      curDBCursor.close(); 
      curDBCursor = null; 
     } 

     dialog.setMessage("Loading data..."); 
     dialog.show(); 
     Runnable runnable = new Runnable() { 
      public void run() { 
       curDBCursor = myDatabaseAdapter.fetchAll(aWhatSearch); 
       // dirty trick 
       try { 
        Thread.sleep(250); // it must be here to show progress 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 

       handler.post(new Runnable() { 
        public void run() { 
         if (dialog.isShowing()) { 
          dialog.dismiss(); 
         } 
         prepareListView(); 
        } 
       }); 

      } 
     }; 
     new Thread(runnable).start(); 
    } 

的結果是一樣的,但是當我用的伎倆與Thread.sleep(250);在數據庫請求期間顯示 ProgressDialog。但它不旋轉, 它在DB請求期間看起來凍結。

DB的東西被稱爲這樣(在搜索按鈕自來水後):

btnSearchAll.setOnClickListener(new OnClickListener() { 
    public void onClick(View v) { 
     // AsyncTask 
     new GetDataFromLangDB().execute(edtTextToSearch.getText().toString()); 

     // or Thread 
     //startProgress(null, edtTextToSearch.getText().toString()); 
    } 
}); 

我發現了很多這樣的問題如此,但沒有什麼是有用的我。 難道數據庫在SD卡上?

+0

DB在SD卡上不是這個原因。你能粘貼你調用AsyncTask的代碼部分嗎? – 2012-08-17 08:09:12

+0

調用代碼很簡單 - 點擊按鈕,更新 – Peter 2012-08-17 08:35:35

回答

1

我把對話框的定義放到了AsyncTask類中,它對我來說工作正常。 看看這個exampel(你必須改變NAMEOFCLASS在類的名稱:

private class doInBackground extends AsyncTask<Integer, Integer, Void> { 

    final ProgressDialog dialog = new ProgressDialog(NAMEOFCLASS.this) { 

    @Override 
    protected void onPreExecute() { 
     dialog.setCancelable(false); 
     dialog.setTitle(getString(R.string.daten_wait_titel)); 
     dialog.setIcon(R.drawable.icon); 
     dialog.setMessage(getString(R.string.dse_dialog_speichern)); 
     dialog.show(); 
    } 

    @Override 
    protected void onCancelled() { 
     dialog.cancel(); 
    } 

....

@Override 
    protected void onProgressUpdate(Integer... values) { 
        // DO YOUR UPDATE HERE 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     dialog.dismiss(); 
       } 

} 
+0

我認爲他的對話框定義在AsyncTask中。他通過使用this.dialog來引用它。 – sinisha 2012-08-17 08:30:58

+0

對話框的定義是在AsyncTask中。所以我很困惑那裏有什麼問題。也許在數據庫負載過重 - >設備沒有響應,因爲繁忙的SQLite驅動程序.... **也許我需要爲此服務(?)** – Peter 2012-08-17 08:38:34

+0

好的。那就對了。然後唯一的區別是Super.OnPreExcecute();也許這將有助於刪除這一行。 – 2012-08-17 08:44:25

0

宣告你對類對話框(活動)級這樣

private ProgressDialog dialog = null; 

顯示進度對話框,並調用的AsyncTask上課的時候,你要開始你忙work..like onButton點擊或任何

dialog = ProgressDialog.show(this,"Sending Email to your account please! wait...", true); 
SendingEmailTask task = new SendingEmailTask(); 
String s = ""; 
task.execute(s); 

創建內部類像

private class SendingEmailTask extends AsyncTask<String, Void, String> { 

    protected String doInBackground(String... urls) { 
     //do your work here.. 
     // like fetching the Data from DB or any 
     return null; 
     } 

     @Override 
     protected void onPostExecute(String str) { 
      //hide progress dialog here 
      dialog.dismiss(); 
     } 
} 

讓我知道這是否有幫助!

+0

謝謝你的回答,但它沒有幫助。它仍然是一樣的。我會嘗試使用AsyncQueryHandler進行sinisha回答,或者我嘗試將其包裝到一個**服務** – Peter 2012-08-17 11:36:07

+0

好吧,我沒有檢查數據庫加載,所以不確定,但我這樣做發送電子郵件等,它適用於我的罰款..祝你好運與AsyncQueryHandler – swiftBoy 2012-08-17 12:29:19

相關問題