1

我在 SDCard 上有一个巨大的数据库 (40MB)。我需要LIKE在查询中获取数据,这非常慢。

数据库请求大约需要 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 被冻结,并且在数据库请求消息后显示“未响应”。

我用这种方式尝试了一个线程:

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 请求期间它看起来冻结了。

数据库的东西是这样调用的(点击搜索按钮后):

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

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

我在 SO 中发现了很多这样的问题,但没有什么对我有用。难道DB在SD卡上?

4

3 回答 3

1

我将对话框的定义放入 AsyncTask 类中,它对我来说很好。看看这个例子(你必须以你的 CLASS 的名称更改 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();
                }

}
于 2012-08-17T08:14:31.560 回答
0

像这样在类(活动)级别上声明你的对话框

private ProgressDialog dialog = null;

显示进度对话框并在您想开始忙碌工作时调用AsyncTask类..如 onButton click 或任何

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();
       }
}

让我知道这是否有帮助!

于 2012-08-17T10:35:16.003 回答
0

也许这个SO 答案可以帮助你。它看起来像类似的问题。尝试使用AsyncQueryHandler查询您的数据库

于 2012-08-17T09:27:46.330 回答