2012-08-17 67 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