0

在较新版本的 Android 中,不允许在主线程中使用互联网任务。要使用它,您必须创建一个新线程。使用线程并非没有问题。

我有一个连接到我的 MySQL 数据库的简单类。它初始化一个connection包含java.sql.Connection对象的变量。我有一个getConnection返回对象的方法。

在主线程中,我希望能够查询数据库:

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

因为数据库类 ,DatabaseManager实现了 Runnable 并且我已经使用它创建了一个线程,所以我无法调用该方法:它没有效果。

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

如何在线程中调用方法?例如,当用户单击 UI 中的添加按钮时,程序应显示等待图标、执行查询并隐藏图标。

4

2 回答 2

0

您可以子类化IntentService并将其用于您的网络调用。当你启动服务时,它的onHandleIntent(Intent intent)方法会被你用来启动它的 Intent 调用。该方法中所做的一切都在主线程之外处理。

要处理对 UI 线程的回调,您可以执行以下任一操作:

  1. 完成处理后发送广播IntentIntentService并让它包含有关网络调用结果的信息。在您的活动中定义一个BroadcastReceiver监听该广播的活动。在 中注册onStart()和取消注册onStop()
  2. Handler为您创建一个自定义Activity并为其创建一个Messenger对象。当您Intent启动服务时,Messenger在 Intent 中打包 as en extra。当你IntentService完成后,用它来回调Handler你的Activity.
于 2013-06-07T15:40:24.993 回答
0

学习如何使用ContentProviders, ContentObservers, and CursorLoaders, and 或许SyncAdapter。在一篇文章中涵盖了很多内容,但基本上......

  • ContentProvider用于访问设备上应用的本地 SQLite 数据库中的数据
  • ContentObservers 监控 URI 的变化,以便在数据库中的数据发生变化时采取行动
  • CursorLoaders 将从 UI 线程进行数据库查询并返回结果,并注册一个 ContentObserver 以便在数据更改时重新查询(它代表您透明地执行此操作)
  • SyncAdapter让您定期执行同步操作

找到 Google I/O 应用程序的源代码,他们使用上述所有内容。您可以在网上找到它,只需搜索“iosched source”即可。

于 2013-06-07T15:29:38.270 回答