Android 學習記錄-網絡請求

網絡服務

Apache HTTP Client

bug少,但是佔內存大。


HttpURLConnection

輕巧,android方便使用,一般推薦這個。

使用網絡需要加權限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
在maniest 文件中加上。

如果UI線程處理所有事件,會阻塞程序,導致掛起狀態,如網絡請求或者數據庫查詢,

因此Android 的單線程模式必須遵守兩條規則:

  1. 不要阻塞 UI 線程
  2. 不要在 UI 線程之外訪問 Android UI 工具包
例如,以下代碼演示了一個點擊偵聽器從單獨的線程下載圖像並將其顯示在 ImageView 中:

public void onClick(View v) {
    new Thread(new Runnable() {
        public void run() {
            Bitmap b = loadImageFromNetwork("http://example.com/image.png");
            mImageView.setImageBitmap(b);
        }
    }).start();
}
違反了規則2,UI線程外訪問UI工具包,imageView。

爲解決此問題,Android 提供了幾種途徑來從其他線程訪問 UI 線程。以下列出了幾種有用的方法:
    Activity.runOnUiThread(Runnable)
    View.post(Runnable)
    View.postDelayed(Runnable, long)

但是,隨着操作日趨複雜,這類代碼也會變得複雜且難以維護。 要通過工作線程處理更復雜的交互,可以考慮在工作線程中使用 Handler 處理來自 UI 線程的消息。當然,最好的解決方案或許是擴展 AsyncTask 類,此類簡化了與 UI 進行交互所需執行的工作線程任務。

使用 AsyncTask

AsyncTask 允許對用戶界面執行異步操作。它會先阻塞工作線程中的操作,然後在 UI 線程中發佈結果,而無需您親自處理線程和/或處理程序。

三個參數

  Params 啓動任務執行的輸入參數,比如HTTP請求的URL。
  Progress 後臺任務執行的百分比。
  Result 後臺執行任務最終返回的結果,比如String。


要使用它,必須創建 AsyncTask 子類並實現 doInBackground() 回調方法,該方法將在後臺線程池中運行。要更新 UI,必須實現 onPostExecute() 以傳遞 doInBackground() 返回的結果並在 UI 線程中運行,這樣,您即可安全更新 UI。稍後,您可以通過從 UI 線程調用 execute() 來運行任務。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章