1

SDCard に巨大なデータベース (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());
    }
});

SOでこのような問題をたくさん見つけましたが、何も役に立ちませんでした。DBがSDカードにあるのでしょうか?

4

3 に答える 3

1

ダイアログの定義を AsyncTask クラスに入れましたが、問題なく動作します。この例を見てください (クラスの名前の 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クリックなど

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 に答える