首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

施用 Android 实现联网

2012-09-04 
使用 Android 实现联网Android SDK 网络包Android 并发性实践衍生线程根本不能修改 UI。因此在不冻结 UI ,

使用 Android 实现联网
Android SDK 网络包


Android 并发性实践
衍生线程根本不能修改 UI。因此在不冻结 UI ,但另一方面,在数据收到之后又允许您修改 UI 的情况下,您怎样检索数据?android.os.Handler 类允许您在线程之间协调和通信. 下面代码显示了一个使用 Handler 的已更新 refreshStockData 方法。

实际工作的多线程 — 通过使用 Handler



类完全封装了一个用于存储股票信息的 SQLite 数据库。因为您将要使用一个嵌入式数据库,不仅是您的应用程序要使用它,而且也要通过应用程序来创建它。您需要提供代码来创建该数据库。Android 提供一个有用的抽象帮助类 SQLiteOpenHelper。要完成这一操作,您需要扩展这个抽象类并提供代码通过使用 onCreate 方法创建您的数据库。当您有一个帮助程序实例时,就可以获取一个 SQLiteDatabase 实例,您可以用来执行任意 SQL 语句。

您的数据库类有两个较为方便的方法。第一个是 addStock,用于将新股票保存到数据库中。注意,您使用了一个 SQLiteStatement 实例,这类似于一个 java.sql.PreparedStatement。需要注意的是,在您的类构造器中如何对其进行编译,使其在每次调用 addStock 时都能重复利用。在每个 addStock 调用中,SQLiteStatement 的变量(INSERT_SQL 字符串中的问号)必然要将数据传递给 addStock。再一次强调,这类似于 PreparedStatement ,您可以从 JDBC 了解它。

另一个方法是 getStocks。顾名思义,它从数据库中检索所有股票。注意,您再次使用一个 SQL 字符串,正如您在 JDBC 中所用的那样。您可以在 SQLiteDatabase 类上通过使用 rawQuery 方法来进行处理。这个类也有几个查询方法,让您可以不使用 SQL 直接查询数据库。所有这些方法都返回一个 Cursor 对象,和 java.sql.ResultSet 非常相似。您可以将 Cursor 移动到从数据库中返回的数据所在行,在每一行,您可以使用 getInt、getString 和其他的方法来检索您要查询的数据库中各列相关的值。再一次强调,这和 ResultSet 十分相似。也和 ResultSet 比较相似,当您完成操作之后,关闭 Cursor 也十分重要的。如果您没有关闭 Cursors,那么可能会迅速地耗尽内存并导致您的应用程序崩溃。

查询本地数据库是一个比较慢的过程,特别是,如果您有多行数据或者您需要在多个表之间运行复杂的查询语句。然而,数据库查询或插入超过 5 秒且出现一个 Application Not Responding 对话框,这种情况不太可能发生,但是当您的数据库忙于读取和写入数据时,冻结您的 UI 是不明智的。当然,避免这种情况最好的办法是使用 AsyncTask。下面的代码 展示了这个示例。

在一个单独的线程上插入数据库
public void SDCardSizeTest() {      // 取得SDCard当前的状态   String sDcString = android.os.Environment.getExternalStorageState();      if (sDcString.equals(android.os.Environment.MEDIA_MOUNTED)) {          // 取得sdcard文件路径       File pathFile = android.os.Environment.getExternalStorageDirectory();          android.os.StatFs statfs = new android.os.StatFs(pathFile.getPath());          // 获取SDCard上BLOCK总数       long nTotalBlocks = statfs.getBlockCount();          // 获取SDCard上每个block的SIZE       long nBlocSize = statfs.getBlockSize();          // 获取可供程序使用的Block的数量       long nAvailaBlock = statfs.getAvailableBlocks();          // 获取剩下的所有Block的数量(包括预留的一般程序无法使用的块)       long nFreeBlock = statfs.getFreeBlocks();          // 计算SDCard 总容量大小MB       long nSDTotalSize = nTotalBlocks * nBlocSize / 1024 / 1024;          // 计算 SDCard 剩余大小MB       long nSDFreeSize = nAvailaBlock * nBlocSize / 1024 / 1024;   }// end of if  }// end of func  

热点排行