享受Android应用程序的Java技术盛宴
2010-10-27 21:24:37 来源:Web开发网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();
}
更多精彩
赞助商链接