Android Day04-網路編程

來源:互聯網
上載者:User

標籤: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-網路編程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.