WEB开发网
开发学院手机开发Android 开发 享受Android应用程序的Java技术盛宴 阅读

享受Android应用程序的Java技术盛宴

 2010-10-27 21:24:37 来源:Web开发网   
核心提示:Android 网络通过网络使用 Java 编程进行调用是简单的,我们熟悉的 java.net 包含几个执行此操作的类,享受Android应用程序的Java技术盛宴(2),这些类大多数在 Android 中都可用,事实上,因此必须确定生成一个线程来获取数据,清单 2 显示了一种解决方法,您可以使用像 java.net.

Android 网络

通过网络使用 Java 编程进行调用是简单的,我们熟悉的 java.net 包含几个执行此操作的类。这些类大多数在 Android 中都可用,事实上,您可以使用像 java.net.URL 和 java.net.URLConnection 这样的类,就像您在其他 Java 应用程序中那样。然而,Android 包括 pache HttpClient 库,这是在 Android 上连接网络的首选方法。即使您使用常用 Java 类,Android 实现仍然使用 HttpClient。清单 1 显示了一个使用这个必不可少的库的示例。(所有源代码见 下载。)

清单 1. 在 Android 上使用 Http Client 库

private ArrayList<Stock> fetchStockData(Stock[] oldStocks)
throws ClientProtocolException, IOException{
StringBuilder sb = new StringBuilder();
for (Stock stock : oldStocks){
sb.append(stock.getSymbol());
sb.append('+');
}
sb.deleteCharAt(sb.length() - 1);
String urlStr = 
"http://finance.yahoo.com/d/quotes.csv?f=sb2n&s=" +
sb.toString();
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(urlStr.toString());
HttpResponse response = client.execute(request);
BufferedReader reader = new BufferedReader( 
new InputStreamReader(response.getEntity().getContent()));
String line = reader.readLine();
int i = 0;
ArrayList<Stock> newStocks = new ArrayList<Stock>(oldStocks.length);
while (line != null){
String[] values = line.split(",");
Stock stock = new Stock(oldStocks[i], oldStocks[i].getId());
stock.setCurrentPrice(Double.parseDouble(values[1]));
stock.setName(values[2]);
newStocks.add(stock);
line = reader.readLine();
i++;
}
return newStocks;
}

在这段代码中有一组 Stock 对象。这是基本的数据结构对象,保存用户拥有股票信息(比如,代号、价格等)以及更多的个人信息(比如,用户付了多少钱)。您可以使用 HttpClient 类从 Yahoo Finance 检索动态数据(例如,这支股票目前的价格)。HttpClient 包含一个 HttpUriRequest ,在本例中,您可以使用 HttpGet,这是 HttpUriRequest 的一个子类。类似地,当您需要向远程服务器发送数据时,可以使用 HttpPost 类,当您从客户端得到 HttpResponse 时,您能接触到响应的潜在 InputStream、对其进行缓冲、解析来获取股票信息。

现在,您看到了如何通过网络检索数据、如何用这个数据来通过使用多线程智能地更新 Android UI。

Android 并发性实践

如果您在应用程序的主 UI 线程上运行 清单 1 中的代码,可能会出现 Application Not Responding 对话框,具体视用户网络速度而定。因此必须确定生成一个线程来获取数据。清单 2 显示了一种解决方法。

清单 2. Naïve 多线程(别这样,这行不通!)

private void refreshStockData(){
Runnable task = new Runnable(){
public void run() {
try {
ArrayList<Stock> newStocks = 
fetchStockData(stocks.toArray( 
new Stock[stocks.size()]));
for (int i=0;i<stocks.size();i++){
Stock s = stocks.get(i);
s.setCurrentPrice( 
newStocks.get(i).getCurrentPrice());
s.setName(newStocks.get(i).getName());
refresh();
}
} catch (Exception e) {
Log.e("StockPortfolioViewStocks", 
"Exception getting stock data", e);
}
}
};
Thread t = new Thread(task);
t.start();
} 

上一页  1 2 3 4 5  下一页

Tags:享受 Android 应用程序

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接