ProgressDialog没有的AsyncTask所示(ProgressDialog not sh

2019-10-17 03:37发布

我上的SD卡一个庞大的数据库(40MB)。 我需要获取数据,与LIKE查询,这是非常缓慢的。

DB请求大约需要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的DB请求期间未示出。 完成数据库查询后,它在屏幕上闪烁的时间很短。 当用户试图敲击数据库请求期间的屏幕,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());
    }
});

我发现了很多这样的问题如此,但没有什么是有用的我。 难道说DB是SD卡?

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

}


Answer 2:

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



Answer 3:

声明您在类(活动)对话框级这样的

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

让我知道,如果这帮助!



文章来源: ProgressDialog not shown in AsyncTask