日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
享受Android應(yīng)用程序的Java技術(shù)盛宴

盡管很多人反感“Android應(yīng)該改名叫Java GE”這種說(shuō)法,但是沒(méi)人能否認(rèn)Java語(yǔ)言是Android開(kāi)發(fā)人員所選的必備工具。Android運(yùn)行時(shí)使用自己的虛擬機(jī)Dalvik,這并不是多數(shù)程序開(kāi)發(fā)人員使用的普通Java虛擬機(jī)。Dalvik支持Java編程語(yǔ)言的大部分功能—但并不是全部。在本文中,您將學(xué)習(xí)高級(jí)Java功能及其如何在Android中實(shí)現(xiàn)。這些功能包括并發(fā)性、聯(lián)網(wǎng)和數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)。

創(chuàng)新互聯(lián)2013年開(kāi)創(chuàng)至今,是專(zhuān)業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元織金做網(wǎng)站,已為上家服務(wù),為織金各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話(huà):13518219792

推薦:Android開(kāi)發(fā)專(zhuān)題

Android應(yīng)用程序一個(gè)最常見(jiàn)的任務(wù)就是檢索數(shù)據(jù)或通過(guò)網(wǎng)絡(luò)將數(shù)據(jù)發(fā)送到遠(yuǎn)程服務(wù)器。這一操作的結(jié)果通常是一些您想要展示給用戶(hù)的新數(shù)據(jù)。這意味著您需要修改用戶(hù)界面。大多數(shù)開(kāi)發(fā)人員知道您將不會(huì)執(zhí)行一個(gè)潛在的長(zhǎng)期運(yùn)行任務(wù),例如,在主UI線(xiàn)程上通過(guò)網(wǎng)絡(luò)訪(fǎng)問(wèn)數(shù)據(jù)(特別使用一個(gè)網(wǎng)絡(luò)連接非常慢的手機(jī))。凍結(jié)您的應(yīng)用程序直至長(zhǎng)期運(yùn)行任務(wù)完成。事實(shí)上,如果這個(gè)任務(wù)超過(guò)5秒,Android操作系統(tǒng)將出現(xiàn)臭名昭著的Application Not Responding對(duì)話(huà)框。

 
圖1.Android臭名昭著的Application Not Responding對(duì)話(huà)框

您不可能知道用戶(hù)網(wǎng)絡(luò)連接能有多慢。為了避免冒險(xiǎn),您必須在不同的線(xiàn)程上執(zhí)行任務(wù),或者至少不在主UI線(xiàn)程上執(zhí)行。許多Android應(yīng)用程序,但不是全部,需要處理多線(xiàn)程,由此引起并發(fā)。應(yīng)用程序經(jīng)常需要本地保存數(shù)據(jù),Android數(shù)據(jù)庫(kù)是一個(gè)很好的選擇。這三個(gè)場(chǎng)景(不同線(xiàn)程,并發(fā)和本地保存數(shù)據(jù))在Java環(huán)境中有許多標(biāo)準(zhǔn)方法可以用來(lái)處理。然而,正如您將要看到的,Android提供不同的選擇。讓我們逐個(gè)看看,看看其優(yōu)點(diǎn)和缺點(diǎn)。

Android網(wǎng)絡(luò)

通過(guò)網(wǎng)絡(luò)使用Java編程進(jìn)行調(diào)用是簡(jiǎn)單的,我們熟悉的java.net包含幾個(gè)執(zhí)行此操作的類(lèi)。這些類(lèi)大多數(shù)在Android中都可用,事實(shí)上,您可以使用像java.net.URL和java.net.URLConnection這樣的類(lèi),就像您在其他Java應(yīng)用程序中那樣。然而,Android包括pacheHttpClient庫(kù),這是在Android上連接網(wǎng)絡(luò)的***方法。即使您使用常用Java類(lèi),Android實(shí)現(xiàn)仍然使用HttpClient。清單1顯示了一個(gè)使用這個(gè)必不可少的庫(kù)的示例。

清單1.在Android上使用Http Client庫(kù)

 
 
 
 
  1. private ArrayList fetchStockData(Stock[] oldStocks)   
  2.     throws ClientProtocolException, IOException{  
  3.     StringBuilder sb = new StringBuilder();  
  4.     for (Stock stock : oldStocks){  
  5.         sb.append(stock.getSymbol());  
  6.         sb.append('+');  
  7.     }  
  8.     sb.deleteCharAt(sb.length() - 1);  
  9.     String urlStr =   
  10.         "http://finance.yahoo.com/d/quotes.csv?f=sb2n&s=" +   
  11.                 sb.toString();  
  12.     HttpClient client = new DefaultHttpClient();  
  13.     HttpGet request = new HttpGet(urlStr.toString());  
  14.     HttpResponse response = client.execute(request);  
  15.     BufferedReader reader = new BufferedReader(  
  16.             new InputStreamReader(response.getEntity().getContent()));  
  17.     String line = reader.readLine();  
  18.     int i = 0;  
  19.     ArrayList newnewStocks = new ArrayList(oldStocks.length);  
  20.     while (line != null){  
  21.         String[] values = line.split(",");  
  22.         Stock stock = new Stock(oldStocks[i], oldStocks[i].getId());  
  23.         stock.setCurrentPrice(Double.parseDouble(values[1]));  
  24.         stock.setName(values[2]);  
  25.         newStocks.add(stock);  
  26.         line = reader.readLine();  
  27.         i++;  
  28.     }  
  29.     return newStocks;  

在這段代碼中有一組Stock對(duì)象。這是基本的數(shù)據(jù)結(jié)構(gòu)對(duì)象,保存用戶(hù)擁有股票信息(比如,代號(hào)、價(jià)格等)以及更多的個(gè)人信息(比如,用戶(hù)付了多少錢(qián))。您可以使用HttpClient類(lèi)從Yahoo Finance檢索動(dòng)態(tài)數(shù)據(jù)(例如,這支股票目前的價(jià)格)。HttpClient包含一個(gè)HttpUriRequest,在本例中,您可以使用HttpGet,這是HttpUriRequest的一個(gè)子類(lèi)。類(lèi)似地,當(dāng)您需要向遠(yuǎn)程服務(wù)器發(fā)送數(shù)據(jù)時(shí),可以使用HttpPost類(lèi),當(dāng)您從客戶(hù)端得到HttpResponse時(shí),您能接觸到響應(yīng)的潛在InputStream、對(duì)其進(jìn)行緩沖、解析來(lái)獲取股票信息。

現(xiàn)在,您看到了如何通過(guò)網(wǎng)絡(luò)檢索數(shù)據(jù)、如何用這個(gè)數(shù)據(jù)來(lái)通過(guò)使用多線(xiàn)程智能地更新Android UI。

#p#

Android并發(fā)性實(shí)踐

如果您在應(yīng)用程序的主UI線(xiàn)程上運(yùn)行清單1中的代碼,可能會(huì)出現(xiàn)Application Not Responding對(duì)話(huà)框,具體視用戶(hù)網(wǎng)絡(luò)速度而定。因此必須確定生成一個(gè)線(xiàn)程來(lái)獲取數(shù)據(jù)。清單2顯示了一種解決方法。

清單2.Na?ve多線(xiàn)程(別這樣,這行不通?。?/strong>

 
 
 
 
  1. private void refreshStockData(){  
  2.     Runnable task = new Runnable(){  
  3.         public void run() {  
  4.             try {  
  5.                 ArrayList newStocks =   
  6.                     fetchStockData(stocks.toArray(  
  7.                                   new Stock[stocks.size()]));  
  8.                 for (int i=0;i
  9.                     Stock s = stocks.get(i);  
  10.                     s.setCurrentPrice(  
  11.                                   newStocks.get(i).getCurrentPrice());  
  12.                     s.setName(newStocks.get(i).getName());  
  13.                     refresh();  
  14.                 }  
  15.             } catch (Exception e) {  
  16.                 Log.e("StockPortfolioViewStocks",   
  17.                             "Exception getting stock data", e);  
  18.             }  
  19.         }  
  20.     };  
  21.     Thread t = new Thread(task);  
  22.     t.start();  

清單2的標(biāo)題聲明這是na?ve代碼,確實(shí)是。在這個(gè)例子中,您將調(diào)用清單1中的fetchStockData方法,將其封裝在Runnable對(duì)象中,并在一個(gè)新線(xiàn)程中執(zhí)行。在這個(gè)新線(xiàn)程中,您可以訪(fǎng)問(wèn)stocks,一個(gè)封裝Activity(此類(lèi)創(chuàng)建了UI)的成員變量。顧名思義,這是Stock對(duì)象的一個(gè)數(shù)據(jù)結(jié)構(gòu)(本例中是java.util.ArrayList)。換句話(huà)說(shuō),您在兩個(gè)線(xiàn)程之間共享數(shù)據(jù),主UI線(xiàn)程和衍生(spawned)線(xiàn)程(在清單2中調(diào)用)。當(dāng)您修改了衍生線(xiàn)程中的共享數(shù)據(jù)時(shí),通過(guò)在Activity對(duì)象上調(diào)用refresh方法來(lái)更新UI。

如果您編寫(xiě)了Java Swing應(yīng)用程序,您可能需要遵循一個(gè)像這樣的模式。然而,這在Android中將不能正常工作。衍生線(xiàn)程根本不能修改UI。因此在不凍結(jié)UI,但另一方面,在數(shù)據(jù)收到之后又允許您修改UI的情況下,您怎樣檢索數(shù)據(jù)?android.os.Handler類(lèi)允許您在線(xiàn)程之間協(xié)調(diào)和通信。清單3顯示了一個(gè)使用Handler的已更新refreshStockData方法。

清單3.實(shí)際工作的多線(xiàn)程—通過(guò)使用Handler

 
 
 
 
  1. private void refreshStockData(){  
  2.     final ArrayList localStocks =   
  3.           new ArrayList(stocks.size());  
  4.     for (Stock stock : stocks){  
  5.         localStocks.add(new Stock(stock, stock.getId()));  
  6.     }  
  7.     final Handler handler = new Handler(){  
  8.         @Override  
  9.         public void handleMessage(Message msg) {  
  10.             for (int i=0;i
  11.                 stocks.set(i, localStocks.get(i));  
  12.             }  
  13.             refresh();  
  14.         }  
  15.     };  
  16.     Runnable task = new Runnable(){  
  17.         public void run() {  
  18.             try {  
  19.                 ArrayList newStocks =   
  20.                     fetchStockData(localStocks.toArray(  
  21.                                   new Stock[localStocks.size()]));  
  22.                 for (int i=0;i
  23.                     Stock ns = newStocks.get(i);  
  24.                     Stock ls = localStocks.get(i);  
  25.                     ls.setName(ns.getName());  
  26.                     ls.setCurrentPrice(ns.getCurrentPrice());  
  27.                 }  
  28.                 handler.sendEmptyMessage(RESULT_OK);  
  29.             } catch (Exception e) {  
  30.                 Log.e("StockPortfolioViewStocks",   
  31.                             "Exception getting stock data", e);  
  32.             }   
  33.         }  
  34.     };  
  35.     Thread dataThread = new Thread(task);  
  36.     dataThread.start();  

在清單2和清單3中的代碼有兩個(gè)主要的不同。明顯的差異是Handler的存在。第二個(gè)不同是,在衍生線(xiàn)程中,您不能修改UI。相反的,當(dāng)您將消息發(fā)送到Handler,然后由Handler來(lái)修改UI。也要注意,在線(xiàn)程中您不能修改stocks成員變量,正如您之前所做的。相反地您可以修改數(shù)據(jù)的本地副本。嚴(yán)格地來(lái)說(shuō),這是不是必須的,但這更為安全。

清單3說(shuō)明了在并發(fā)編程中一些非常普遍的模式:復(fù)制數(shù)據(jù)、將數(shù)據(jù)解析到執(zhí)行長(zhǎng)期任務(wù)的線(xiàn)程中、將結(jié)果數(shù)據(jù)傳遞回主UI線(xiàn)程、以及根據(jù)所屬數(shù)據(jù)更新主UI線(xiàn)程。Handlers是Android中的主要通信機(jī)制,它們使這個(gè)模式易于實(shí)現(xiàn)。然而,清單3中仍然有一些樣本代碼。幸好,Android提供方法來(lái)封裝和消除大多數(shù)樣本代碼。清單4演示了這一過(guò)程。

清單4.用一個(gè)AsyncTask使多線(xiàn)程更容易

 
 
 
 
  1.  
  2.  
  3.       
  4. private void refreshStockData() {  
  5.     new AsyncTask>(){  
  6.         @Override  
  7.         protected void onPostExecute(ArrayList result) {  
  8.             ViewStocks.this.stocks = result;  
  9.             refresh();  
  10.         }  
  11.  
  12.         @Override  
  13.         protected ArrayList doInBackground(Stock... stocks){  
  14.             try {  
  15.                 return fetchStockData(stocks);  
  16.             } catch (Exception e) {  
  17.                 Log.e("StockPortfolioViewStocks", "Exception getting stock data", e);  
  18.             }  
  19.             return null;  
  20.         }  
  21.     }.execute(stocks.toArray(new Stock[stocks.size()]));  
  22. }  

如您所見(jiàn),清單4比起清單3樣本代碼明顯減少。您不能創(chuàng)建任何線(xiàn)程或Handlers。使用AsyncTask來(lái)封裝所有樣本代碼。要?jiǎng)?chuàng)建AsyncTask,您必須實(shí)現(xiàn)doInBackground方法。該方法總是在獨(dú)立的線(xiàn)程中執(zhí)行,因此您可以自由調(diào)用長(zhǎng)期運(yùn)行任務(wù)。它的輸入類(lèi)型來(lái)自您所創(chuàng)建的AsyncTask的類(lèi)型參數(shù)。在本例中,***個(gè)類(lèi)型參數(shù)是Stock,因此doInBackground獲得傳遞給它的一組Stock對(duì)象。類(lèi)似地,它返回一個(gè)ArrayList ,因?yàn)檫@是AsyncTask的第三個(gè)類(lèi)型參數(shù)。在此例中,我也選擇重寫(xiě)onPostExecute方法。這是一個(gè)可選方法,如果您需要使用從doInBackground返回的數(shù)據(jù)來(lái)進(jìn)行一些操作,您可以選用這種方法來(lái)實(shí)現(xiàn)。這個(gè)方法總是在主UI線(xiàn)程上被執(zhí)行,因此對(duì)于修改UI這是一個(gè)很好的選擇。

有了AsyncTask,您就完全可以簡(jiǎn)化多線(xiàn)程代碼。它可以將許多并發(fā)陷阱從您的開(kāi)發(fā)路徑刪除,您仍然可以使用AsyncTask尋找一些潛在問(wèn)題,例如,在doInBackground方法對(duì)象執(zhí)行的同時(shí)設(shè)備上的方向發(fā)生改變時(shí)可能發(fā)生什么。更多關(guān)于如何處理這類(lèi)案例的技術(shù),見(jiàn)參考資料的鏈接。

現(xiàn)在我們開(kāi)始討論另一個(gè)常見(jiàn)任務(wù),其中Android明顯背離常用的Java方法——使用數(shù)據(jù)庫(kù)進(jìn)行處理。

#p#

Android數(shù)據(jù)庫(kù)連通性

Android中一個(gè)非常有用的特征就是存在本地關(guān)系數(shù)據(jù)庫(kù)。保證您能在本地文件中存儲(chǔ)您的數(shù)據(jù),但通常更有用的是使用一個(gè)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RelationalDatabaseManagementSystem,RDBMS)來(lái)存儲(chǔ)。Android提供給您常用的SQLite數(shù)據(jù)庫(kù)來(lái)進(jìn)行處理,因?yàn)閷?duì)于像Android這類(lèi)嵌入式系統(tǒng)它是高度優(yōu)化的。它被Android上的核心應(yīng)用程序所用。例如,用戶(hù)地址簿是存儲(chǔ)在一個(gè)SQLite數(shù)據(jù)庫(kù)中。現(xiàn)在,對(duì)于給定的Android的Java實(shí)現(xiàn),您可以使用JDBC來(lái)訪(fǎng)問(wèn)這些數(shù)據(jù)庫(kù)。出人意料的是,Android甚至包括構(gòu)成主要部分JDBC API的java.sql和javax.sql包。然而,當(dāng)涉及使用本地Android數(shù)據(jù)庫(kù)進(jìn)行處理時(shí),這毫無(wú)用處。相反地,您想要使用android.database和android.database.sqlite包。清單5是一個(gè)使用這些類(lèi)存儲(chǔ)和檢索數(shù)據(jù)的示例。

清單5.使用Android進(jìn)行數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)

 
 
 
 
  1. public class StocksDb {  
  2.     private static final String DB_NAME = "stocks.db";  
  3.     private static final int DB_VERSION = 1;  
  4.     private static final String TABLE_NAME = "stock";  
  5.     private static final String CREATE_TABLE = "CREATE TABLE " +   
  6.         TABLE_NAME + " (id INTEGER PRIMARY KEY, symbol TEXT, max_price DECIMAL(8,2), " +  
  7.             "min_price DECIMAL(8,2), price_paid DECIMAL(8,2), " +  
  8.             "quantity INTEGER)";  
  9.     private static final String INSERT_SQL = "INSERT INTO " + TABLE_NAME +  
  10.             " (symbol, max_price, min_price, price_paid, quantity) " +  
  11.             "VALUES (?,?,?,?,?)";  
  12.     private static final String READ_SQL = "SELECT id, symbol, max_price, " +  
  13.             "min_price, price_paid, quantity FROM " + TABLE_NAME;  
  14.     private final Context context;  
  15.     private final SQLiteOpenHelper helper;  
  16.     private final SQLiteStatement stmt;  
  17.     private final SQLiteDatabase db;  
  18.     public StocksDb(Context context){  
  19.         this.context = context;  
  20.         helper = new SQLiteOpenHelper(context, DB_NAME, null,   
  21.                 DB_VERSION){  
  22.             @Override  
  23.             public void onCreate(SQLiteDatabase db) {  
  24.                 db.execSQL(CREATE_TABLE);  
  25.             }  
  26.  
  27.             @Override  
  28.             public void onUpgrade(SQLiteDatabase db, int oldVersion,   
  29.                     int newVersion) {  
  30.                 throw new UnsupportedOperationException();  
  31.             }  
  32.         };  
  33.         db = helper.getWritableDatabase();  
  34.         stmt = db.compileStatement(INSERT_SQL);  
  35.     }  
  36.     public Stock addStock(Stock stock){  
  37.         stmt.bindString(1, stock.getSymbol());  
  38.         stmt.bindDouble(2, stock.getMaxPrice());  
  39.         stmt.bindDouble(3, stock.getMinPrice());  
  40.         stmt.bindDouble(4, stock.getPricePaid());  
  41.         stmt.bindLong(5, stock.getQuantity());  
  42.         int id = (int) stmt.executeInsert();  
  43.         return new Stock (stock, id);  
  44.     }  
  45.     public ArrayList getStocks() {  
  46.         Cursor results = db.rawQuery(READ_SQL, null);  
  47.         ArrayList stocks =   
  48.                  new ArrayList(results.getCount());  
  49.         if (results.moveToFirst()){  
  50.             int idCol = results.getColumnIndex("id");  
  51.             int symbolCol = results.getColumnIndex("symbol");  
  52.             int maxCol = results.getColumnIndex("max_price");  
  53.             int minCol = results.getColumnIndex("min_price");  
  54.             int priceCol = results.getColumnIndex("price_paid");  
  55.             int quanitytCol = results.getColumnIndex("quantity");  
  56.             do {  
  57.                 Stock stock = new Stock(results.getString(symbolCol),   
  58.                         results.getDouble(priceCol),   
  59.                         results.getInt(quanitytCol),   
  60.                                     results.getInt(idCol));  
  61.                 stock.setMaxPrice(results.getDouble(maxCol));  
  62.                 stock.setMinPrice(results.getDouble(minCol));  
  63.                 stocks.add(stock);  
  64.             } while (results.moveToNext());  
  65.         }  
  66.         if (!results.isClosed()){  
  67.             results.close();  
  68.         }  
  69.         return stocks;  
  70.     }  
  71.     public void close(){  
  72.         helper.close();  
  73.     }      
  74. }  

清單5中的類(lèi)完全封裝了一個(gè)用于存儲(chǔ)股票信息的SQLite數(shù)據(jù)庫(kù)。因?yàn)槟鷮⒁褂靡粋€(gè)嵌入式數(shù)據(jù)庫(kù),不僅是您的應(yīng)用程序要使用它,而且也要通過(guò)應(yīng)用程序來(lái)創(chuàng)建它。您需要提供代碼來(lái)創(chuàng)建該數(shù)據(jù)庫(kù)。Android提供一個(gè)有用的抽象幫助類(lèi)SQLiteOpenHelper。要完成這一操作,您需要擴(kuò)展這個(gè)抽象類(lèi)并提供代碼通過(guò)使用onCreate方法創(chuàng)建您的數(shù)據(jù)庫(kù)。當(dāng)您有一個(gè)幫助程序?qū)嵗龝r(shí),就可以獲取一個(gè)SQLiteDatabase實(shí)例,您可以用來(lái)執(zhí)行任意SQL語(yǔ)句。您的數(shù)據(jù)庫(kù)類(lèi)有兩個(gè)較為方便的方法。***個(gè)是addStock,用于將新股票保存到數(shù)據(jù)庫(kù)中。注意,您使用了一個(gè)SQLiteStatement實(shí)例,這類(lèi)似于一個(gè)java.sql.PreparedStatement。需要注意的是,在您的類(lèi)構(gòu)造器中如何對(duì)其進(jìn)行編譯,使其在每次調(diào)用addStock時(shí)都能重復(fù)利用。在每個(gè)addStock調(diào)用中,SQLiteStatement的變量(INSERT_SQL字符串中的問(wèn)號(hào))必然要將數(shù)據(jù)傳遞給addStock。再一次強(qiáng)調(diào),這類(lèi)似于PreparedStatement,您可以從JDBC了解它。

另一個(gè)方法是getStocks。顧名思義,它從數(shù)據(jù)庫(kù)中檢索所有股票。注意,您再次使用一個(gè)SQL字符串,正如您在JDBC中所用的那樣。您可以在SQLiteDatabase類(lèi)上通過(guò)使用rawQuery方法來(lái)進(jìn)行處理。這個(gè)類(lèi)也有幾個(gè)查詢(xún)方法,讓您可以不使用SQL直接查詢(xún)數(shù)據(jù)庫(kù)。所有這些方法都返回一個(gè)Cursor對(duì)象,和java.sql.ResultSet非常相似。您可以將Cursor移動(dòng)到從數(shù)據(jù)庫(kù)中返回的數(shù)據(jù)所在行,在每一行,您可以使用getInt、getString和其他的方法來(lái)檢索您要查詢(xún)的數(shù)據(jù)庫(kù)中各列相關(guān)的值。再一次強(qiáng)調(diào),這和ResultSet十分相似。也和ResultSet比較相似,當(dāng)您完成操作之后,關(guān)閉Cursor也十分重要的。如果您沒(méi)有關(guān)閉Cursors,那么可能會(huì)迅速地耗盡內(nèi)存并導(dǎo)致您的應(yīng)用程序崩潰。

查詢(xún)本地?cái)?shù)據(jù)庫(kù)是一個(gè)比較慢的過(guò)程,特別是,如果您有多行數(shù)據(jù)或者您需要在多個(gè)表之間運(yùn)行復(fù)雜的查詢(xún)語(yǔ)句。然而,數(shù)據(jù)庫(kù)查詢(xún)或插入超過(guò)5秒且出現(xiàn)一個(gè)Application Not Responding對(duì)話(huà)框,這種情況不太可能發(fā)生,但是當(dāng)您的數(shù)據(jù)庫(kù)忙于讀取和寫(xiě)入數(shù)據(jù)時(shí),凍結(jié)您的UI是不明智的。當(dāng)然,避免這種情況***的辦法是使用AsyncTask。清單6展示了這個(gè)示例。

清單6.在一個(gè)單獨(dú)的線(xiàn)程上插入數(shù)據(jù)庫(kù)

 
 
 
 
  1. Button button = (Button) findViewById(R.id.btn);  
  2. button.setOnClickListener(new OnClickListener(){  
  3.     public void onClick(View v) {  
  4.         String symbol = symbolIn.getText().toString();  
  5.         symbolIn.setText("");  
  6.         double max = Double.parseDouble(maxIn.getText().toString());  
  7.         maxIn.setText("");  
  8.         double min = Double.parseDouble(minIn.getText().toString());  
  9.         minIn.setText("");  
  10.         double pricePaid =   
  11.                 Double.parseDouble(priceIn.getText().toString());  
  12.         priceIn.setText("");  
  13.         int quantity = Integer.parseInt(quantIn.getText().toString());  
  14.         quantIn.setText("");  
  15.         Stock stock = new Stock(symbol, pricePaid, quantity);  
  16.         stock.setMaxPrice(max);  
  17.         stock.setMinPrice(min);  
  18.         new AsyncTask(){  
  19.             @Override  
  20.             protected Stock doInBackground(Stock... newStocks) {  
  21.                 // There can be only one!  
  22.                 return db.addStock(newStocks[0]);  
  23.             }  
  24.             @Override  
  25.             protected void onPostExecute(Stock s){  
  26.                 addStockAndRefresh(s);  
  27.             }  
  28.         }.execute(stock);  
  29.     }  
  30. }); 

您可以先為按鈕創(chuàng)建一個(gè)實(shí)踐監(jiān)聽(tīng)器。當(dāng)用戶(hù)點(diǎn)擊按鈕時(shí),您可以從各個(gè)小部件(確切地說(shuō)是EditText小部件)讀取股票數(shù)據(jù)并填入一個(gè)新的Stock對(duì)象。您可以創(chuàng)建一個(gè)AsyncTask,并通過(guò)doInBackground方法從清單5中調(diào)用addStock方法。如此,addStock將在一個(gè)背景線(xiàn)程上執(zhí)行,而不是在主UI線(xiàn)程上。完成之后,將新Stock對(duì)象從數(shù)據(jù)庫(kù)傳遞到在主UI線(xiàn)程上執(zhí)行的addStockAndRefresh方法。

作者簡(jiǎn)介:Michael Galpin是eBay的一名架構(gòu)師。他從1998年開(kāi)始做職業(yè)程序員,并擁有加州理工學(xué)院數(shù)學(xué)專(zhuān)業(yè)的學(xué)士學(xué)位。

【編輯推薦】

  1. 多圖詳解 “Android UI”設(shè)計(jì)官方教程
  2. Android應(yīng)該改名叫Java GE
  3. 圖文并茂 在MyEclipse 8.6上搭建Android開(kāi)發(fā)環(huán)境
  4. 兩大動(dòng)力指引Android向更多領(lǐng)域進(jìn)軍

網(wǎng)站名稱(chēng):享受Android應(yīng)用程序的Java技術(shù)盛宴
文章源于:http://www.5511xx.com/article/cojpods.html