上一篇文章中,讲了 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.youkuaiyun.com/jxxfzgy/article/details/44044947