1

コールログからデータを収集し、それをデータベースに入れ、それらを ListView にクエリしています。500 回の呼び出しで約 8 秒かかり、見栄えが悪いため、ロードするアイテムがいくつ残っているかをユーザーに表示する進行状況ダイアログを実装することにしました。今、私は 3 つの項目を試しています (エミュレーターのコールログに 3 つの項目があります)。プログレス ダイアログが終了すると、リストビューに 3 つの項目が表示されますが、同じ 3 つの項目が何度も追加され、無限ループが発生します。

データを入力する前にテーブルを空にするので、常に 3 つのレコードがあります。

何が問題になる可能性がありますか?

pd = new ProgressDialog(Calllogs.this);
        pd.setCancelable(true);
        pd.setMessage("Loading...");
        pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        pd.setProgress(0);
        pd.setMax(3);
        pd.show();


        //incrementProgressBy
        new Thread(new Runnable() {                 
            @Override
            public void run() {
                   try
                   {
                    while(pd.getProgress()<=pd.getMax())
                      {
                        Thread.sleep(1000);

//collect data and populate database table
//query data and populate arrays

 handler.sendMessage(handler.obtainMessage());
        if(pd.getProgress()==pd.getMax())
        {
             pd.dismiss();
             adapter = new ListViewCustomAdapter(Calllogs.this, arr_calllog_name, arr_calllog_phone, arr_calllog_type,arr_calllog_duration, arr_calllog_date);
             lv1.post(new Runnable() {
                 public void run() {
                     lv1.setAdapter(adapter);
               }}); 

        }
        }
    }catch(Exception e){}
   }
   }).start();

そしてハンドラー:

 private Handler handler = new Handler() {
                        @Override
                        public void handleMessage(Message msg) {
                             super.handleMessage(msg);
                            pd.incrementProgressBy(1);    
                            //pd.dismiss();


                        }
                };

編集:テーブルの人口全体が無限ループになっていることが偶然わかりました。sqlite データベース ブラウザでテーブルを確認したところ、最初は 21 個のアイテムがあり、59 個から数秒後には成長し、最後に強制的に閉じられました。

解決策:

これが見えなかったなんて信じられない。スレッドは人口から始まり、それが無限ループを引き起こしました。コールログ クエリの後、データベース クエリの前に配置する必要がありました。

4

1 に答える 1

0

これが見えなかったなんて信じられない。スレッドは人口から始まり、それが無限ループを引き起こしました。コールログ クエリの後、データベース クエリの前に配置する必要がありました。

于 2012-06-05T12:51:47.270 に答える