Android Volley解析(二)之表单提交篇

上一篇文章中,讲了 Volley 的 get 和 post 请求,并且对 volley 的基本使用和基本分析做了讲解,而这篇 blog 将讲解用 volley 实现表单的提交,在看这篇文章之前,如果对 Volley 基本知识不够了解的朋友,可以移驾前往Android Volley解析(一)之GET、POST请求篇

表单提交的数据格式

要实现表单的提交,就要知道表单提交的数据格式是怎么样,这里我从某知名网站抓了一条数据,先来分析别人提交表单的数据格式。
数据包:

<code class="hljs http has-numbering"><span class="hljs-attribute">Connection</span>: <span class="hljs-string">keep-alive</span>
<span class="hljs-attribute">Content-Length</span>: <span class="hljs-string">123</span>
<span class="hljs-attribute">X-Requested-With</span>: <span class="hljs-string">ShockwaveFlash/16.0.0.296</span>
<span class="hljs-attribute">User-Agent</span>: <span class="hljs-string">Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.93 Safari/537.36</span>
<span class="hljs-attribute">Content-Type</span>: <span class="hljs-string">multipart/form-data; boundary=----------Ij5ei4KM7KM7ae0KM7cH2ae0Ij5Ef1</span>
<span class="hljs-attribute">Accept</span>: <span class="hljs-string">*/*</span>
<span class="hljs-attribute">Accept-Encoding</span>: <span class="hljs-string">gzip, deflate</span>
<span class="hljs-attribute">Accept-Language</span>: <span class="hljs-string">zh-CN,zh;q=0.8</span>
<span class="hljs-attribute">Cookie</span>: <span class="hljs-string">bdshare_firstime=1409052493497</span>

<span class="haskell"><span class="hljs-comment">------------Ij5ei4KM7KM7ae0KM7cH2ae0Ij5Ef1</span>
<span class="hljs-type">Content</span>-<span class="hljs-type">Disposition</span>: form-<span class="hljs-typedef"><span class="hljs-keyword">data</span>; name="position"</span>

<span class="hljs-number">1425264476444</span>
<span class="hljs-comment">------------Ij5ei4KM7KM7ae0KM7cH2ae0Ij5Ef1</span>
<span class="hljs-type">Content</span>-<span class="hljs-type">Disposition</span>: form-<span class="hljs-typedef"><span class="hljs-keyword">data</span>; name="editorIndex"</span>

<span class="hljs-title">ue_con_1425264252856</span>
<span class="hljs-comment">------------Ij5ei4KM7KM7ae0KM7cH2ae0Ij5Ef1</span>
<span class="hljs-type">Content</span>-<span class="hljs-type">Disposition</span>: form-<span class="hljs-typedef"><span class="hljs-keyword">data</span>; name="cm"</span>

<span class="hljs-number">100672</span>
<span class="hljs-comment">------------Ij5ei4KM7KM7ae0KM7cH2ae0Ij5Ef1--</span></span></code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li></ul>

看到上面的数据包,我们不需要全部分析,我们主要关心的是数据如何封装,因为http请求头,在网络请求中已经为我们封装好了;可以看到这里总共是提交了三条数据,每一条数据的格式都是一样的,所以我们只需要分析一条数据即可,这里拿最后一条数据来说,因为在所有的数据之后还有一个结尾的标志。

<code class="hljs haskell has-numbering"><span class="hljs-comment">------------Ij5ei4KM7KM7ae0KM7cH2ae0Ij5Ef1</span>
<span class="hljs-type">Content</span>-<span class="hljs-type">Disposition</span>: form-<span class="hljs-typedef"><span class="hljs-keyword">data</span>; name="cm"</span>

<span class="hljs-number">100672</span>
<span class="hljs-comment">------------Ij5ei4KM7KM7ae0KM7cH2ae0Ij5Ef1--</span></code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul>

这条数据一共有四行组成,加上结尾标志共有五行
1、第一行:

<code class="hljs mel has-numbering"><span class="hljs-string">"--"</span> + <span class="hljs-keyword">boundary</span> + <span class="hljs-string">"\r\n"</span> ;</code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>

说明:”–”为数据开始标志,boundary为http实体头定义的边界分割线,boundary可以是任意的字符串,只要和Content-Type: multipart/form-data; boundary=———-Ij5ei4KM7KM7ae0KM7cH2ae0Ij5Ef1中保持一直即可,”\r\n”为回车换行;
2、第二行:

<code class="hljs bash has-numbering"><span class="hljs-string">"Content-Disposition: form-data; name="</span>参数的名称<span class="hljs-string">""</span> + <span class="hljs-string">"\r\n"</span> ;</code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>

说明:Content-Disposition表示上传的内容特性,form-data上传内容特性为表单的形式;
3、第三行:

<code class="hljs lisp has-numbering"><span class="hljs-string">"\r\n"</span> <span class="hljs-comment">;</span></code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>

4、说明:这是一个空行,只有一个回车换行 ;
第四行:

<code class="hljs bash has-numbering"><span class="hljs-string">"参数的值"</span> + <span class="hljs-string">"\r\n"</span> ;</code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>

说明:每个参数都是由一个key和value组成,而这一行就是value跟回车换行符
结尾行:

<code class="hljs mel has-numbering"><span class="hljs-string">"--"</span> + <span class="hljs-keyword">boundary</span> + <span class="hljs-string">"--"</span> + <span class="hljs-string">"\r\n"</span> ;</code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>

说明:在所有的数据结束之后,需要有这个结尾标志。
如果有多个参数,则重复1、2、3、4,直至最后一个参数的最后加上结尾行。

参数实体类

这里对参数做一个封装,因为往往提交表单的时候,都需要提交多个参数

<code class="hljs java has-numbering"><span class="hljs-javadoc">/**
 * Created by gyzhong on 15/3/2.
 */</span>
<span class="hljs-comment">/*表单提交的参数*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">FormText</span> {</span>
    <span class="hljs-comment">/*参数的名称*/</span>
    <span class="hljs-keyword">private</span> String mName ;
    <span class="hljs-comment">/*参数的值*/</span>
    <span class="hljs-keyword">private</span> String mValue ;

    <span class="hljs-keyword">public</span> <span class="hljs-title">FormText</span>(String mName, String mValue) {
        <span class="hljs-keyword">this</span>.mName = mName;
        <span class="hljs-keyword">this</span>.mValue = mValue;
    }

    <span class="hljs-keyword">public</span> String <span class="hljs-title">getName</span>() {
        <span class="hljs-keyword">return</span> mName;
    }

    <span class="hljs-keyword">public</span> String <span class="hljs-title">getValue</span>() {
        <span class="hljs-keyword">return</span> mValue;
    }

}</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li></ul>

Volley 对数据的封装

在上一篇文章中我们讲了如何定制自己的 Request,在这里同样需要用到。在定制 Request 的时候,需要重写获取实体的方法

<code class="hljs java has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-keyword">byte</span>[] <span class="hljs-title">getBody</span>() <span class="hljs-keyword">throws</span> AuthFailureError {}</code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>

把参数通过二进制的形式传给服务器,当然就不需要重写获取参数的方法

<code class="hljs java has-numbering"><span class="hljs-keyword">protected</span> Map<String, String> <span class="hljs-title">getParams</span>() <span class="hljs-keyword">throws</span> AuthFailureError {}</code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>

最核心的方法也就在getBody()中,这个方法的实现,如果对表单提交的数据格式很了解,实现起来非常简单,因为这个方法就是把参数拼接成我们所分析的数据格式;

<code class="hljs avrasm has-numbering">    @Override
    public byte[] getBody() throws AuthFailureError {
        if (mListItem == null||mListItem<span class="hljs-preprocessor">.size</span>() == <span class="hljs-number">0</span>){
            return super<span class="hljs-preprocessor">.getBody</span>() <span class="hljs-comment">;</span>
        }
        ByteArrayOutputStream bos = new ByteArrayOutputStream() <span class="hljs-comment">;</span>
        int N = mListItem<span class="hljs-preprocessor">.size</span>() <span class="hljs-comment">;</span>
        FormText formText <span class="hljs-comment">;</span>
        for (int i = <span class="hljs-number">0</span><span class="hljs-comment">; i < N ;i++){</span>
            formText = mListItem<span class="hljs-preprocessor">.get</span>(i) <span class="hljs-comment">;</span>
            StringBuffer sb= new StringBuffer() <span class="hljs-comment">;</span>
            <span class="hljs-comment">/*第一行:"--" + boundary + "\r\n" ;*/</span>
            sb<span class="hljs-preprocessor">.append</span>(<span class="hljs-string">"--"</span>+BOUNDARY)<span class="hljs-comment">;</span>
            sb<span class="hljs-preprocessor">.append</span>(<span class="hljs-string">"\r\n"</span>) <span class="hljs-comment">;</span>
            <span class="hljs-comment">/*第二行:"Content-Disposition: form-data; name="参数的名称"" + "\r\n" ;*/</span>
            sb<span class="hljs-preprocessor">.append</span>(<span class="hljs-string">"Content-Disposition: form-data;"</span>)<span class="hljs-comment">;</span>
            sb<span class="hljs-preprocessor">.append</span>(<span class="hljs-string">"name=\""</span>)<span class="hljs-comment">;</span>
            sb<span class="hljs-preprocessor">.append</span>(formText<span class="hljs-preprocessor">.getName</span>()) <span class="hljs-comment">;</span>
            sb<span class="hljs-preprocessor">.append</span>(<span class="hljs-string">"\""</span>) <span class="hljs-comment">;</span>
            sb<span class="hljs-preprocessor">.append</span>(<span class="hljs-string">"\r\n"</span>) <span class="hljs-comment">;</span>
            <span class="hljs-comment">/*第三行:"\r\n" ;*/</span>
            sb<span class="hljs-preprocessor">.append</span>(<span class="hljs-string">"\r\n"</span>) <span class="hljs-comment">;</span>
            <span class="hljs-comment">/*第四行:"参数的值" + "\r\n" ;*/</span>
            sb<span class="hljs-preprocessor">.append</span>(formText<span class="hljs-preprocessor">.getValue</span>()) <span class="hljs-comment">;</span>
            sb<span class="hljs-preprocessor">.append</span>(<span class="hljs-string">"\r\n"</span>) <span class="hljs-comment">;</span>
            try {
                bos<span class="hljs-preprocessor">.write</span>(sb<span class="hljs-preprocessor">.toString</span>()<span class="hljs-preprocessor">.getBytes</span>(<span class="hljs-string">"utf-8"</span>))<span class="hljs-comment">;</span>
            } catch (IOException e) {
                e<span class="hljs-preprocessor">.printStackTrace</span>()<span class="hljs-comment">;</span>
            }
        }
        <span class="hljs-comment">/*结尾行:"--" + boundary + "--" + "\r\n" ;*/</span>
        String endLine = <span class="hljs-string">"--"</span> + BOUNDARY + <span class="hljs-string">"--"</span>+ <span class="hljs-string">"\r\n"</span> <span class="hljs-comment">;</span>
        try {
            bos<span class="hljs-preprocessor">.write</span>(endLine<span class="hljs-preprocessor">.toString</span>()<span class="hljs-preprocessor">.getBytes</span>(<span class="hljs-string">"utf-8"</span>))<span class="hljs-comment">;</span>
        } catch (IOException e) {
            e<span class="hljs-preprocessor">.printStackTrace</span>()<span class="hljs-comment">;</span>
        }
        Log<span class="hljs-preprocessor">.v</span>(<span class="hljs-string">"zgy"</span>,<span class="hljs-string">"=====formText====\n"</span>+bos<span class="hljs-preprocessor">.toString</span>()) <span class="hljs-comment">;</span>
        return bos<span class="hljs-preprocessor">.toByteArray</span>()<span class="hljs-comment">;</span>
    }</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li></ul>

可以看到,这个方法的实现,就是对数据按照我们所分析的格式组装。
在 Request 中还有一个关键的地方,需要在 http 头部中声明内容类型为表单数据

<code class="hljs haskell has-numbering"><span class="hljs-type">Content</span>-<span class="hljs-type">Type</span>: multipart/form-<span class="hljs-typedef"><span class="hljs-keyword">data</span>; boundary=<span class="hljs-comment">----------8888888888888</span></span></code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>

所以的重写下面方法为

<code class="hljs cs has-numbering"><span class="hljs-keyword">public</span> String <span class="hljs-title">getBodyContentType</span>() {
        <span class="hljs-keyword">return</span> MULTIPART_FORM_DATA+<span class="hljs-string">"; boundary="</span>+BOUNDARY;
    }</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul>

同样,我们还是前面我们blog 中讲到的接口http://www.minongbang.com/test.php?test=minongbang来测试,所以解析数据那一块跟 前面我们将的一样,具体实现如下:

<code class="hljs scala has-numbering"><span class="hljs-javadoc">/**
 * Created by gyzhong on 15/3/2.
 */</span>
public <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">PostFormRequest</span><<span class="hljs-title">T</span>> <span class="hljs-keyword">extends</span> <span class="hljs-title">Request</span><<span class="hljs-title">T</span>> {</span>

    <span class="hljs-javadoc">/**
     * 正确数据的时候回掉用
     */</span>
    <span class="hljs-keyword">private</span> ResponseListener mListener ;
    <span class="hljs-comment">/*用来解析 json 用的*/</span>
    <span class="hljs-keyword">private</span> Gson mGson ;
    <span class="hljs-comment">/*在用 gson 解析 json 数据的时候,需要用到这个参数*/</span>
    <span class="hljs-keyword">private</span> Type mClazz ;
    <span class="hljs-comment">/*请求 数据通过参数的形式传入*/</span>
    <span class="hljs-keyword">private</span> List<FormText> mListItem ;

    <span class="hljs-keyword">private</span> String BOUNDARY = <span class="hljs-string">"---------8888888888888"</span>; <span class="hljs-comment">//数据分隔线</span>
    <span class="hljs-keyword">private</span> String MULTIPART_FORM_DATA = <span class="hljs-string">"multipart/form-data"</span>;

    public PostFormRequest(String url, List<FormText> listItem, Type <span class="hljs-keyword">type</span>, ResponseListener listener) {
        <span class="hljs-keyword">super</span>(Method.POST, url, listener);
        <span class="hljs-keyword">this</span>.mListener = listener ;
        mGson = <span class="hljs-keyword">new</span> GsonBuilder().excludeFieldsWithoutExposeAnnotation().create() ;
        mClazz = <span class="hljs-keyword">type</span> ;
        setShouldCache(<span class="hljs-keyword">false</span>);
        mListItem = listItem ;
    }

    <span class="hljs-javadoc">/**
     * 这里开始解析数据
     * <span class="hljs-javadoctag">@param</span> response Response from the network
     * <span class="hljs-javadoctag">@return</span>
     */</span>
    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">protected</span> Response<T> parseNetworkResponse(NetworkResponse response) {
        <span class="hljs-keyword">try</span> {
            T result ;
            String jsonString =
                    <span class="hljs-keyword">new</span> String(response.data, HttpHeaderParser.parseCharset(response.headers));
            Log.v(<span class="hljs-string">"zgy"</span>, <span class="hljs-string">"====SearchResult==="</span> + jsonString);
            result = mGson.fromJson(jsonString,mClazz) ;
            <span class="hljs-keyword">return</span> Response.success(result,
                    HttpHeaderParser.parseCacheHeaders(response));
        } <span class="hljs-keyword">catch</span> (UnsupportedEncodingException e) {
            <span class="hljs-keyword">return</span> Response.error(<span class="hljs-keyword">new</span> ParseError(e));
        }
    }

    <span class="hljs-javadoc">/**
     * 回调正确的数据
     * <span class="hljs-javadoctag">@param</span> response The parsed response returned by
     */</span>
    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">protected</span> void deliverResponse(T response) {
        mListener.onResponse(response);
    }

    <span class="hljs-annotation">@Override</span>
    public byte[] getBody() <span class="hljs-keyword">throws</span> AuthFailureError {
        <span class="hljs-keyword">if</span> (mListItem == <span class="hljs-keyword">null</span>||mListItem.size() == <span class="hljs-number">0</span>){
            <span class="hljs-keyword">return</span> <span class="hljs-keyword">super</span>.getBody() ;
        }
        ByteArrayOutputStream bos = <span class="hljs-keyword">new</span> ByteArrayOutputStream() ;
        int N = mListItem.size() ;
        FormText formText ;
        <span class="hljs-keyword">for</span> (int i = <span class="hljs-number">0</span>; i < N ;i++){
            formText = mListItem.get(i) ;
            StringBuffer sb= <span class="hljs-keyword">new</span> StringBuffer() ;
            <span class="hljs-comment">/*第一行:"--" + boundary + "\r\n" ;*/</span>
            sb.append(<span class="hljs-string">"--"</span>+BOUNDARY);
            sb.append(<span class="hljs-string">"\r\n"</span>) ;
            <span class="hljs-comment">/*第二行:"Content-Disposition: form-data; name="参数的名称"" + "\r\n" ;*/</span>
            sb.append(<span class="hljs-string">"Content-Disposition: form-data;"</span>);
            sb.append(<span class="hljs-string">"name=\""</span>);
            sb.append(formText.getName()) ;
            sb.append(<span class="hljs-string">"\""</span>) ;
            sb.append(<span class="hljs-string">"\r\n"</span>) ;
            <span class="hljs-comment">/*第三行:"\r\n" ;*/</span>
            sb.append(<span class="hljs-string">"\r\n"</span>) ;
            <span class="hljs-comment">/*第四行:"参数的值" + "\r\n" ;*/</span>
            sb.append(formText.getValue()) ;
            sb.append(<span class="hljs-string">"\r\n"</span>) ;
            <span class="hljs-keyword">try</span> {
                bos.write(sb.toString().getBytes(<span class="hljs-string">"utf-8"</span>));
            } <span class="hljs-keyword">catch</span> (IOException e) {
                e.printStackTrace();
            }
        }
        <span class="hljs-comment">/*结尾行:"--" + boundary + "--" + "\r\n" ;*/</span>
        String endLine = <span class="hljs-string">"--"</span> + BOUNDARY + <span class="hljs-string">"--"</span>+ <span class="hljs-string">"\r\n"</span> ;
        <span class="hljs-keyword">try</span> {
            bos.write(endLine.toString().getBytes(<span class="hljs-string">"utf-8"</span>));
        } <span class="hljs-keyword">catch</span> (IOException e) {
            e.printStackTrace();
        }
        Log.v(<span class="hljs-string">"zgy"</span>,<span class="hljs-string">"=====formText====\n"</span>+bos.toString()) ;
        <span class="hljs-keyword">return</span> bos.toByteArray();
    }

    <span class="hljs-comment">/*获取内容类型,这里为表单类型*/</span>
    <span class="hljs-annotation">@Override</span>
    public String getBodyContentType() {
        <span class="hljs-keyword">return</span> MULTIPART_FORM_DATA+<span class="hljs-string">"; boundary="</span>+BOUNDARY;
    }
}
</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li><li>83</li><li>84</li><li>85</li><li>86</li><li>87</li><li>88</li><li>89</li><li>90</li><li>91</li><li>92</li><li>93</li><li>94</li><li>95</li><li>96</li><li>97</li><li>98</li><li>99</li><li>100</li><li>101</li><li>102</li><li>103</li><li>104</li><li>105</li><li>106</li></ul>

表单提交接口

接口我们在上一篇博文中也做了比较详细的讲解,这里就不累赘了。

<code class="hljs java has-numbering">    <span class="hljs-javadoc">/**
     *  minong 测试post表单提交接口
     *<span class="hljs-javadoctag"> @param</span>  value 测试数据
     *<span class="hljs-javadoctag"> @param</span> listener 回调接口,包含错误回调和正确的数据回调
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">postFormMiNongApi</span>(String value,ResponseListener listener){
        List<FormText> formTextList = <span class="hljs-keyword">new</span> ArrayList<FormText>() ;
        formTextList.add(<span class="hljs-keyword">new</span> FormText(<span class="hljs-string">" test"</span>,value));
        Request request = <span class="hljs-keyword">new</span> PostFormRequest(Constant.MiNonghost,formTextList,<span class="hljs-keyword">new</span> TypeToken<SearchResult>(){}.getType(),listener) ;
        VolleyUtil.getRequestQueue().add(request) ;
    }</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li></ul>

测试

PostFormActivity.java的测试代码如下

<code class="hljs java has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">PostFormActivity</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">ActionBarActivity</span> {</span>

    <span class="hljs-keyword">private</span> ListView mListView ;
    <span class="hljs-keyword">private</span> SongAdapter mAdapter ;
    <span class="hljs-keyword">private</span> List<SongDetail> mSongList ;
    <span class="hljs-keyword">private</span> ProgressDialog mDialog ;
    <span class="hljs-keyword">private</span> View mHeaderView ;
    <span class="hljs-keyword">private</span> TextView mShowPostData ;
    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>(Bundle savedInstanceState) {
        <span class="hljs-keyword">super</span>.onCreate(savedInstanceState);
        setContentView(R.layout.activity_post_form);
        mSongList = <span class="hljs-keyword">new</span> ArrayList<SongDetail>() ;
        mListView = (ListView) findViewById(R.id.id_list_view);
        mAdapter = <span class="hljs-keyword">new</span> SongAdapter(<span class="hljs-keyword">this</span>,mSongList) ;
        mHeaderView = getLayoutInflater().inflate(R.layout.list_header_item,<span class="hljs-keyword">null</span>) ;
        mShowPostData = (TextView) mHeaderView.findViewById(R.id.id_post_data) ;
        mListView.addHeaderView(mHeaderView);
        mListView.setAdapter(mAdapter);
        mDialog = <span class="hljs-keyword">new</span> ProgressDialog(<span class="hljs-keyword">this</span>) ;
        mDialog.setMessage(<span class="hljs-string">"数据提交中..."</span>);
        mDialog.show() ;
        <span class="hljs-comment">/*请求网络获取数据*/</span>
        MiNongApi.postFormMiNongApi(<span class="hljs-string">" minongbang"</span>,<span class="hljs-keyword">new</span> DataResponseListener<SearchResult>() {
            <span class="hljs-annotation">@Override</span>
            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onErrorResponse</span>(VolleyError error) {
                Log.v(<span class="hljs-string">"zgy"</span>,<span class="hljs-string">"======onErrorResponse====="</span>+error);
                mDialog.dismiss();
            }

            <span class="hljs-annotation">@Override</span>
            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onResponse</span>(SearchResult response) {
                Log.v(<span class="hljs-string">"zgy"</span>,<span class="hljs-string">"======onResponse====="</span>+response);
                mSongList.addAll(response.getData().getInfo()) ;
                mAdapter.notifyDataSetChanged();
                mDialog.dismiss();
            }

            <span class="hljs-annotation">@Override</span>
            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">postData</span>(String data) {
                mShowPostData.setText(data);
            }
        });
    }</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li></ul>

通过以上内容我们不难发现,表单提交就是把文本通过二进制的形式传给服务器,从而得到对应的响应,这篇 blog 其实也算是一篇过度的文章,因为一般我们不会这么提交文字数据,而是通过我们上一篇 blog 中的post 请求的方式,那什么时候我们需要用到表单提交呢,当表单中含有附件,如图片,视频等文件的的时候;这也就是我们下一篇 blog 要讲的:volley 解析(三)文件上传篇


转载自:http://blog.csdn.net/jxxfzgy/article/details/44044947

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值