清單 1. 在 Android 上使用 Http Client 庫(kù)
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 = "
在這段代碼中有一組 Stock 對(duì)象。這是基本的數(shù)據(jù)結(jié)構(gòu)對(duì)象,保存用戶擁有股票信息(比如,代號(hào)、價(jià)格等)以及更多的個(gè)人信息(比如,用戶付了多少錢)。您可以使用 HttpClient 類從 Yahoo Finance 檢索動(dòng)態(tài)數(shù)據(jù)(例如,這支股票目前的價(jià)格)。HttpClient 包含一個(gè) HttpUriRequest ,在本例中,您可以使用 HttpGet,這是 HttpUriRequest 的一個(gè)子類。類似地,當(dāng)您需要向遠(yuǎn)程服務(wù)器發(fā)送數(shù)據(jù)時(shí),可以使用 HttpPost 類,當(dāng)您從客戶端得到 HttpResponse 時(shí),您能接觸到響應(yīng)的潛在 InputStream、對(duì)其進(jìn)行緩沖、解析來(lái)獲取股票信息。
現(xiàn)在,您看到了如何通過(guò)網(wǎng)絡(luò)檢索數(shù)據(jù)、如何用這個(gè)數(shù)據(jù)來(lái)通過(guò)使用多線程智能地更新 Android UI。
Android 并發(fā)性實(shí)踐
如果您在應(yīng)用程序的主 UI 線程上運(yùn)行 清單 1 中的代碼,可能會(huì)出現(xiàn) Application Not Responding 對(duì)話框,具體視用戶網(wǎng)絡(luò)速度而定。因此必須確定生成一個(gè)線程來(lái)獲取數(shù)據(jù)。清單 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(); }
清單 2 的標(biāo)題聲明這是 naïve 代碼,確實(shí)是。在這個(gè)例子中,您將調(diào)用 清單 1 中的 fetchStockData 方法,將其封裝在 Runnable 對(duì)象中,并在一個(gè)新線程中執(zhí)行。在這個(gè)新線程中,您可以訪問(wèn) stocks,一個(gè)封裝 Activity(此類創(chuàng)建了 UI)的成員變量。顧名思義,這是 Stock 對(duì)象的一個(gè)數(shù)據(jù)結(jié)構(gòu)(本例中是 java.util.ArrayList)。換句話說(shuō),您在兩個(gè)線程之間共享數(shù)據(jù),主 UI 線程和衍生(spawned)線程(在 清單 2 中調(diào)用)。當(dāng)您修改了衍生線程中的共享數(shù)據(jù)時(shí),通過(guò)在 Activity 對(duì)象上調(diào)用 refresh 方法來(lái)更新 UI。
如果您編寫了 Java Swing 應(yīng)用程序,您可能需要遵循一個(gè)像這樣的模式。然而,這在 Android 中將不能正常工作。衍生線程根本不能修改 UI。因此在不凍結(jié) UI ,但另一方面,在數(shù)據(jù)收到之后又允許您修改 UI 的情況下,您怎樣檢索數(shù)據(jù)?android.os.Handler 類允許您在線程之間協(xié)調(diào)和通信。清單 3 顯示了一個(gè)使用 Handler 的已更新 refreshStockData 方法。
出處:CSDN
責(zé)任編輯:bluehearts
上一頁(yè) 享受Android應(yīng)用程序的Java技術(shù)盛宴 [1] 下一頁(yè) 享受Android應(yīng)用程序的Java技術(shù)盛宴 [3]
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|