Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android Xutils框架使用問題及解決辦法

Android Xutils框架使用問題及解決辦法

編輯:關於Android編程

剛剛寫了篇博客,提了下在使用XUtils時遇到的一個問題Android Xutils框架HttpUtil Get請求緩存問題 ,既然已經提起來這個問題,那我想了下,就把之前使用Xutils時遇到的幾個小問題整理一下。

 

一、 HttpUtil Get請求緩存問題

關於Xtuls框架的Http模塊的get請求方法,會有緩存問題——即進行get請求時,在緩存規定的時間內,如果發送同樣的請求url,則不會再次請服務器發送請求,而是直接返回上次請求的結果。 之前寫了一篇博客已經介紹的很詳細了,可查看《Android Xutils框架HttpUtil Get請求緩存問題》。

 

二、 如何直接在HTTP請求時發送一個字符串

首先,我想先說下,如何使用Xutils的框架HTTP模塊向服務器發送數據,這裡必須介紹一個API:com.lidroid.xutils.http.RequestParams,我不貼出該類的源碼了,且把方法給大家看下:

\

從以上方法可以看出,它提供的幾個方法非常方便,不僅可以直接使用addQueryStringParameter(String name, String value)方法,將參數以key-value的形式放入其中,(一般用於get請求),還有addBodyParameter(String name, String value) ,講參數放在Http的body中;還有addHeader(String name, String value)等方法,允許添加HTTP請求的Header,可謂是方便之極。

下面有人會問了,如果我不以key-value的形式上傳參數,而是想直接把一串字符(JSON串,普通字符串等)傳到服務器中,那該怎麼辦呢?

有辦法!

1. 對於Get請求,如果要直接上傳一串字符,可以直接把它連接在url上。

比如我要請求的地址是: http://www.imooc.com/api/teacher,需要上傳的參數是“{id: 1,learner: 12312}”,那我可以直接把他拼接在url上,變成 http://www.imooc.com/api/teacher?{id: 1,learner: 12312}

服務器按照約定,再進行相應的處理就好了。當然對於上述的請求,字符串中有特殊字符,我們要求對其進行URL編碼: URLEncoder.encode(),之後才可以上傳。

 

2. 對於Post請求,使用requestParams.setBodyEntity(HttpEntity bodyEntity)

如果我們上傳的是字符串,使用HttpEntity的子類實例StringEntity即可: requestParams.setBodyEntity(new StringEntity())。

 

三、 java.net.URISyntaxException的解決辦法

前些天做項目,使用Xutils Http get請求時,當我發送的一串字符串中含有特殊字符,就會發生這種情況。查找了一些網上資料,說地址中涉及了特殊字符,如‘|’‘&’等。所以不能直接用String代替URI來訪問。必須采用%0xXX方式來替代特殊字符。但這種辦法不直觀。所以只能先把String轉成URL,再能過URL生成URI的方法來解決問題。代碼如下:

URL url = new URL(strUrl);
URI uri = new URI(url.getProtocol(), url.getHost(), url.getPath(), url.getQuery(), null);
HttpClient client    = new DefaultHttpClient();
HttpGet httpget = new HttpGet(uri);

看懂了這裡,所以我們看下Xutils源碼的URIBuilder.java源文件,發現它的構造方法是直接把傳入的url構造成了uri:

 

 

    public URIBuilder(final String uri) {
        try {
            digestURI(new URI(uri));
        } catch (URISyntaxException e) {
            LogUtils.e(e.getMessage(), e);
        }
    }
簡要修改下源碼:

 

 

 public URIBuilder(String uri) {
        try {
            URL e = new URL(uri);
            this.digestURI(new URI(e.getProtocol(), e.getHost(), e.getPath(), e.getQuery(), (String)null));
        } catch (Exception var3) {
            LogUtils.e(var3.getMessage(), var3);
        }

    }
這就好了,重新編譯xutil.jar文件,可以放心使用了。

 

 

當然了,之前說了,對於get請求的特殊字符,我們可以采用URLEncoder.encode()進行特殊字符的編碼來解決。 可是,我試了下,用這個方法並沒能解決我的問題,所以我才采取了修改源碼的方法。有興趣的同學可以再次嘗試下。

 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved