0

Android の新しいバージョンでは、メイン スレッドでインターネット タスクを使用することはできません。使用するには、新しいスレッドを作成する必要があります。スレッドを使用しても問題はありません。

MySQL データベースに接続する単純なクラスがあります。connectionオブジェクトを含む変数を初期化しjava.sql.Connectionます。オブジェクトをgetConnection返すメソッドがあります。

メインスレッドで、データベースにクエリを実行できるようにしたい:

PreparedStatement query = this.dbManager.getConnection().prepareStatement("SELECT ...");

データベース クラス はDatabaseManagerRunnable を実装しており、それを使用してスレッドを作成したため、そのメソッドを呼び出すことができません。効果はありません。

this.dbManager = new DatabaseManager();
new Thread(this.dbManager).start();

スレッドでメソッドを呼び出すにはどうすればよいですか? たとえば、ユーザーが UI の追加ボタンをクリックすると、プログラムは待機中のアイコンを表示し、クエリを実行してアイコンを非表示にする必要があります。

4

2 に答える 2

0

ContentProvidersContentObservers、およびCursorLoaders、およびおそらく の使用方法を学びますSyncAdapter。1回の投稿でカバーするのはかなり多いですが、本質的に...

  • ContentProviderデバイス上のアプリのローカル SQLite データベース内のデータにアクセスするために使用されます
  • ContentObserverデータベース内のデータが変更されたときにアクションを実行できるように、URI の変更を監視します。
  • CursorLoaders は UI スレッドからデータベース クエリを作成し、結果を返します。また、ContentObserver を登録して、データが変更されたときに再クエリできるようにします (ユーザーに代わってこれを透過的に行います)。
  • SyncAdapter同期操作を定期的に実行できます

上記のすべてを使用する Google I/O アプリのソース コードを見つけます。「iosched source」を検索するだけで、オンラインで見つけることができます。

于 2013-06-07T15:29:38.270 に答える
0

サブクラスIntentService化して、ネットワーク呼び出しに使用できます。サービスを開始するonHandleIntent(Intent intent)と、開始に使用したインテントでメソッドが呼び出されます。そのメソッドで行われるすべての処理は、メイン スレッドから離れて処理されます。

UI スレッドへのコールバックを処理するには、次のいずれかを実行できます。

  1. Intent処理が終了したらブロードキャストを送信しIntentService、ネットワーク呼び出しの結果に関する情報を含めます。BroadcastReceiverそのブロードキャストをリッスンするアクティビティで を定義します。で登録し、onStart()で登録解除しonStop()ます。
  2. カスタムHandlerActivity作成し、Messengerオブジェクトを作成します。サービスを開始する を作成するときは、Intent に追加でIntentパッケージ化します。Messenger完了したら、IntentServiceそれを使用して にコールバックしHandlerますActivity
于 2013-06-07T15:40:24.993 に答える