2017-01-16 10 views
-3

私は単純なデータベースを作成します。書き込みと読み込みは正常に実行できます。すぐにデータを表示するリストビューの更新

今、私はデータを書き込むときにすぐに画面に表示したいと思います。

私はスレッドを使用して、それは私がどのようなステップを欠場ん

を働いていないthread.start();を呼び出そうか?どんな援助も感謝しています。ここ

は、リストビューの私のスレッドコードで、それは私はあなたが問題、他のスレッドからUI要素を更新すると思うメインのonCreate

Thread thread=new Thread(new Runnable() { 
     @Override 
     public void run() { 
      sqlForBloodSugar = new MySqlForBloodSugar(BloodSugarReportActivity.this, "bloodSugar.db", null, 1); 

      Cursor cursor = sqlForBloodSugar.getReadableDatabase().query("blood", null, null, null, null, null, null); 

      SimpleCursorAdapter simpleCursorAdapter = new SimpleCursorAdapter(
        BloodSugarReportActivity.this, 
        R.layout.blood_sugar_report_list_item_layout, 
        cursor, 
        new String[]{"_id", "bloodvalue", "eattime", "blooddate"}, 
        new int[]{R.id.item_id, R.id.item_bloodSugar, R.id.item_eatTime, R.id.item_date}, 
        0); 

      listViewBloodReport.setAdapter(simpleCursorAdapter); 
      simpleCursorAdapter.notifyDataSetChanged(); 
     } 
    }); 
    thread.start(); 

答えて

0

下です。 いくつかのエラーメッセージがある場合はお知らせください。

他のスレッドからUI要素を更新するには、runOnUiThreadを使用する必要があります。

runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
       //Do something on UiThread 
      } 
     }); 
+0

ありがとう、私はあなたのコードを試して、それはまだデータがすぐに変更を表示することはできません。エラーメッセージはありません。 ちょうど私のコードのように正常に追加します。 –

+0

**すぐに**と言ったらどういう意味ですか? –

+0

デバッグを使用して、どこにデータが失われているかを確認 –

0

あなたはAsyncTaskのヘルプ(インテリジェントbackroundのスレッド)とProgressDialog

AsyncTaskは、UIスレッドの適切かつ容易な使用を可能にしてこれを行う必要があります。このクラスを使用すると、スレッドやハンドラを操作することなく、バックグラウンド操作を実行し、UIスレッドで結果を公開できます。

非同期タスクは、バックグラウンドスレッドで実行され、その結果がUIスレッドで公開される計算によって定義されます。非同期タスクは、Params、Progress and Result、begin、doInBackground、processProgress、endの4つの一般的なタイプによって定義されます。

onPreExecute()、タスクが実行された直後にUIスレッド上で呼び出さ:

4は、非同期タスクが実行されると、タスクは、4つのステップを経る

ステップ。このステップは通常、タスクを設定するために使用されます。たとえば、ユーザーインターフェイスにプログレスバーを表示します。

doInBackground(Params ...)、onPreExecute()の実行直後にバックグラウンドスレッドで呼び出されます。このステップは、バックグラウンド計算を実行するのに使用され、時間がかかることがあります。非同期タスクのパラメータは、このステップに渡されます。計算結果はこのステップで戻され、最後のステップに戻されます。このステップでは、publishProgress(Progress ...)を使用して、1つ以上の進行単位を公開することもできます。これらの値は、UIスレッドのonProgressUpdate(Progress ...)ステップで公開されます。

onProgressUpdate(Progress ...)、publishProgress(Progress ...)の呼び出し後にUIスレッドで呼び出されます。実行のタイミングは未定義です。このメソッドは、バックグラウンド計算がまだ実行されている間に、ユーザーインターフェイスに進捗状況を表示するために使用されます。たとえば、プログレスバーをアニメートしたり、テキストフィールドにログを表示したりすることができます。

onPostExecute(Result)、バックグラウンド計算が終了した後にUIスレッドで呼び出されます。バックグラウンド計算の結果は、このステップにパラメータとして渡されます。スレッドルール

このクラスが正しく動作するために従わなければならないいくつかのスレッドのルールがあります。

タスク・インスタンスがUIスレッド上で作成する必要がありますが。 execute(Params ...)はUIスレッドで呼び出さなければなりません。 onPreExecute()、onPostExecute(Result)、doInBackground(Params ...)、onProgressUpdate(Progress ...)を手動で呼び出さないでください。タスクは、(第2の実行が試行された場合、例外がスローされます。)一度だけ実行することができ

例コード:アダプターは、この例では何 は重要ではありませんが、より重要なあなたがする必要があることを理解することをAsyncTaskを使用して進行状況のダイアログを表示します。

private class PrepareAdapter1 extends AsyncTask<Void,Void,ContactsListCursorAdapter > { 
    ProgressDialog dialog; 
    @Override 
    protected void onPreExecute() { 
     dialog = new ProgressDialog(viewContacts.this); 
     dialog.setMessage(getString(R.string.please_wait_while_loading)); 
     dialog.setIndeterminate(true); 
     dialog.setCancelable(false); 
     dialog.show(); 
    } 
    /* (non-Javadoc) 
    * @see android.os.AsyncTask#doInBackground(Params[]) 
    */ 
    @Override 
    protected ContactsListCursorAdapter doInBackground(Void... params) { 
     cur1 = objItem.getContacts(); 
     startManagingCursor(cur1); 

     adapter1 = new ContactsListCursorAdapter (viewContacts.this, 
       R.layout.contact_for_listitem, cur1, new String[] {}, new int[] {}); 

     return adapter1; 
    } 

    protected void onPostExecute(ContactsListCursorAdapter result) { 
     list.setAdapter(result); 
     dialog.dismiss(); 
    } 
} 
+0

あなたの熱意のおかげで、私はAsyncTaskとそれを使用する方法を知っているが、doinbackground params、私は新しいPrepareAdapter1 .execute(simpleCursorAdapter);それは正しくないです とcur1 = objItem.getContacts(); 、startManagingCursor(cur1);私はそれが何であるかわからない –

+0

それは完全なコードではない、それは私のプロジェクトのコードブロックです。私はコード全体を投稿することはできません。私はあなたの目的のためにAsyncTaskを使用できると言っています。 –

+0

私は感謝の男を参照してください。やってみます。まず、ケースの解決策を見てみましょう。 –

関連する問題