標籤:android課程
一、網路編程的核心步驟
(1)在清單AndroidManifest.xml檔案中添加INTERNET許可權。
(2)串連到網路地址的代碼
第1步:建立URL
String path = "http://192.168.17.98:8080/img/news.xml"; URL url = new URL(path);
第2步:通過URL獲得串連HttpURLConnection
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
第3步:通過HttpURLConnection串連設定一些請求的參數
conn.setRequestMethod("GET"); //預設請求方式就是GET,要大寫。 conn.setConnectTimeout(5); //連結網路逾時時間,秒作單位。
第4步:請求響應並擷取伺服器的響應碼,判斷響應碼的狀態,採用相應的動作。
int code = conn.getResponseCode(); /*200 代表擷取伺服器資源全 部成功 206 請求部分資源*/ if (code == 200) { //解析串連的輸入資料流,擷取資料,進行其它操作。 ... }
二、Android中的訊息機制
在Android4.0之後,google工程師強制要求Android中的耗時操作(如上面的網路訪問、拷貝
大的資料)放在子線程中運行,否則程式在運行時就會報下面這個錯誤:
android.os.NetworkOnMainThreadException 在主線程訪問網路
然而,在子線程中往往會有更新UI的操作(如改變activity中的組件的text值),但是更新UI
的操作只能在主線程中完成,如果在子線程中有更新UI的動作,程式就會報以下錯誤:
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original
thread that created a view hierarchy can touch its views. 只有主線程才可以更新ui
這樣就形成了矛盾,那麼如何解決這一矛盾呢?解決辦法:有2種方式:
第1種:訊息機制Handler
1)在類的成員位置上建立一個Handler對象,複寫它的handleMessage(Message msg)方法。
在這個方法中擷取子線程傳遞過來的Message,然後更新UI。
//建立助手Handler private Handler handler = new Handler(){public void handleMessage(aMessage msg) { //擷取訊息的類型 switch (msg.what) {case LOADSUCESS: //代表擷取資料成功 //把資料取出來 String content = (String) msg.obj; //要強轉 //顯示源碼的內容tv_content.setText(content);break;case LOADERROR: //代表擷取資料失敗 Toast.makeText(getApplicationContext(), "訪問的資源不存在", 1).show();break;case LOADEXCEPTION:Toast.makeText(getApplicationContext(), "伺服器忙!!!", 1).show();break;} }; };
2)在子線程中調用Handler對象的sendMessage(Message msg)方法,將擷取的資料封裝到
Message中去。
//建立message對象 Message msg = Message.obtain(); //這種方式得到Message對象,可以減少 建立Message的次數。還可以new個對象 msg.what = LOADSUCESS; //標記Message的類型,int型。 msg.obj =content; //這個屬性可以攜帶任何資料類型 //發送一條訊息 告訴系統我要更新ui handleMessage方法會立刻執行 handler.sendMessage(msg);
本文出自 “行意天下” 部落格,請務必保留此出處http://4259297.blog.51cto.com/4249297/1675916
Android Day04-網路編程