Android学习笔记:利用httpclient和AsyncTask 发起网络http post操作 - 51kata - 博客园

来源: Android学习笔记:利用httpclient和AsyncTask 发起网络http post操作 – 51kata – 博客园

1、在Android4中,发起网络http操作,不能在Activity的事件(即主线程)中进行,必须在单独的线程中操作。

另外进行网络操作,需要在manifest文件中增加如下的权限:

<uses-permission Android:name=”android.permission.INTERNET” />

2、下面给出代码事例

<span class="pln">    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> loadData</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">AsyncTask</span><span class="pun"><</span><span class="typ">String</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Void</span><span class="pun">,</span><span class="pln"> </span><span class="typ">String</span><span class="pun">>()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="lit">@Override</span><span class="pln">
            </span><span class="kwd">protected</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> doInBackground</span><span class="pun">(</span><span class="typ">String</span><span class="pun">...</span><span class="pln"> paramsInput</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                </span><span class="typ">String</span><span class="pln"> url </span><span class="pun">=</span><span class="pln"> </span><span class="str">"http://10.0.0.5:8080/examples/action"</span><span class="pun">;</span><span class="pln">
                </span><span class="typ">List</span><span class="pun"><</span><span class="typ">NameValuePair</span><span class="pun">></span><span class="pln"> </span><span class="kwd">params</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayList</span><span class="pun"><</span><span class="typ">NameValuePair</span><span class="pun">>();</span><span class="pln">
                </span><span class="kwd">params</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">BasicNameValuePair</span><span class="pun">(</span><span class="str">"type"</span><span class="pun">,</span><span class="pln"> paramsInput</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]));</span><span class="pln">
                </span><span class="kwd">params</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">BasicNameValuePair</span><span class="pun">(</span><span class="str">"id"</span><span class="pun">,</span><span class="pln"> paramsInput</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]));</span><span class="pln">
                </span><span class="com">/* 建立HTTPPost对象 */</span><span class="pln">
                </span><span class="typ">HttpPost</span><span class="pln"> httpRequest </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">HttpPost</span><span class="pun">(</span><span class="pln">url</span><span class="pun">);</span><span class="pln">
  
                </span><span class="typ">String</span><span class="pln"> strResult </span><span class="pun">=</span><span class="pln"> </span><span class="str">"doPostError"</span><span class="pun">;</span><span class="pln">
                </span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                    </span><span class="typ">HttpClient</span><span class="pln"> httpClient </span><span class="pun">=</span><span class="pln"> getHttpClient</span><span class="pun">();</span><span class="pln">
                    </span><span class="com">/* 添加请求参数到请求对象 */</span><span class="pln">
                    httpRequest</span><span class="pun">.</span><span class="pln">setEntity</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">UrlEncodedFormEntity</span><span class="pun">(</span><span class="kwd">params</span><span class="pun">,</span><span class="pln">
                            HTTP</span><span class="pun">.</span><span class="pln">UTF_8</span><span class="pun">));</span><span class="pln">
                    </span><span class="com">/* 发送请求并等待响应 */</span><span class="pln">
                    </span><span class="typ">HttpResponse</span><span class="pln"> httpResponse </span><span class="pun">=</span><span class="pln"> httpClient</span><span class="pun">.</span><span class="pln">execute</span><span class="pun">(</span><span class="pln">httpRequest</span><span class="pun">);</span><span class="pln">
                    </span><span class="com">/* 若状态码为200 ok */</span><span class="pln">
                    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">httpResponse</span><span class="pun">.</span><span class="pln">getStatusLine</span><span class="pun">().</span><span class="pln">getStatusCode</span><span class="pun">()</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">200</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                        </span><span class="com">/* 读返回数据 */</span><span class="pln">
                        strResult </span><span class="pun">=</span><span class="pln"> </span><span class="typ">EntityUtils</span><span class="pun">.</span><span class="pln">toString</span><span class="pun">(</span><span class="pln">httpResponse
                                </span><span class="pun">.</span><span class="pln">getEntity</span><span class="pun">());</span><span class="pln">
  
                    </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                        strResult </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Error Response: "</span><span class="pln">
                                </span><span class="pun">+</span><span class="pln"> httpResponse</span><span class="pun">.</span><span class="pln">getStatusLine</span><span class="pun">().</span><span class="pln">toString</span><span class="pun">();</span><span class="pln">
                    </span><span class="pun">}</span><span class="pln">
                </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="typ">ClientProtocolException</span><span class="pln"> e</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                    strResult </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Error Response: "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> e</span><span class="pun">.</span><span class="pln">getMessage</span><span class="pun">().</span><span class="pln">toString</span><span class="pun">();</span><span class="pln">
                    e</span><span class="pun">.</span><span class="pln">printStackTrace</span><span class="pun">();</span><span class="pln">
                </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="typ">IOException</span><span class="pln"> e</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                    strResult </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Error Response: "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> e</span><span class="pun">.</span><span class="pln">getMessage</span><span class="pun">().</span><span class="pln">toString</span><span class="pun">();</span><span class="pln">
                    e</span><span class="pun">.</span><span class="pln">printStackTrace</span><span class="pun">();</span><span class="pln">
                </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Exception</span><span class="pln"> e</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                    strResult </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Error Response: "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> e</span><span class="pun">.</span><span class="pln">getMessage</span><span class="pun">().</span><span class="pln">toString</span><span class="pun">();</span><span class="pln">
                    e</span><span class="pun">.</span><span class="pln">printStackTrace</span><span class="pun">();</span><span class="pln">
                </span><span class="pun">}</span><span class="pln">
                </span><span class="kwd">return</span><span class="pln"> strResult</span><span class="pun">;</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
  
            </span><span class="lit">@Override</span><span class="pln">
            </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onPostExecute</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> result</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                </span><span class="typ">TextView</span><span class="pln"> view </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">TextView</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">resultText</span><span class="pun">);</span><span class="pln">
                view</span><span class="pun">.</span><span class="pln">setText</span><span class="pun">(</span><span class="pln">result</span><span class="pun">);</span><span class="pln">
                </span><span class="kwd">super</span><span class="pun">.</span><span class="pln">onPostExecute</span><span class="pun">(</span><span class="pln">result</span><span class="pun">);</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
  
        </span><span class="pun">}.</span><span class="pln">execute</span><span class="pun">(</span><span class="str">"query"</span><span class="pun">,</span><span class="str">"1"</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
  
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">HttpClient</span><span class="pln"> getHttpClient</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  
        </span><span class="com">// 创建 HttpParams 以用来设置 HTTP 参数(这一部分不是必需的)</span><span class="pln">
  
        </span><span class="typ">HttpParams</span><span class="pln"> httpParams </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">BasicHttpParams</span><span class="pun">();</span><span class="pln">
  
        </span><span class="com">// 设置连接超时和 Socket 超时,以及 Socket 缓存大小</span><span class="pln">
  
        </span><span class="typ">HttpConnectionParams</span><span class="pun">.</span><span class="pln">setConnectionTimeout</span><span class="pun">(</span><span class="pln">httpParams</span><span class="pun">,</span><span class="pln"> </span><span class="lit">20</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">);</span><span class="pln">
  
        </span><span class="typ">HttpConnectionParams</span><span class="pun">.</span><span class="pln">setSoTimeout</span><span class="pun">(</span><span class="pln">httpParams</span><span class="pun">,</span><span class="pln"> </span><span class="lit">20</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">);</span><span class="pln">
  
        </span><span class="typ">HttpConnectionParams</span><span class="pun">.</span><span class="pln">setSocketBufferSize</span><span class="pun">(</span><span class="pln">httpParams</span><span class="pun">,</span><span class="pln"> </span><span class="lit">8192</span><span class="pun">);</span><span class="pln">
  
        </span><span class="com">// 设置重定向,缺省为 true</span><span class="pln">
  
        </span><span class="typ">HttpClientParams</span><span class="pun">.</span><span class="pln">setRedirecting</span><span class="pun">(</span><span class="pln">httpParams</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln">
  
        </span><span class="com">// 设置 user agent</span><span class="pln">
  
        </span><span class="typ">String</span><span class="pln"> userAgent </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2) Gecko/20100115 Firefox/3.6"</span><span class="pun">;</span><span class="pln">
        </span><span class="typ">HttpProtocolParams</span><span class="pun">.</span><span class="pln">setUserAgent</span><span class="pun">(</span><span class="pln">httpParams</span><span class="pun">,</span><span class="pln"> userAgent</span><span class="pun">);</span><span class="pln">
  
        </span><span class="com">// 创建一个 HttpClient 实例</span><span class="pln">
  
        </span><span class="com">// 注意 HttpClient httpClient = new HttpClient(); 是Commons HttpClient</span><span class="pln">
  
        </span><span class="com">// 中的用法,在 Android 1.5 中我们需要使用 Apache 的缺省实现 DefaultHttpClient</span><span class="pln">
  
        </span><span class="typ">HttpClient</span><span class="pln"> httpClient </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DefaultHttpClient</span><span class="pun">(</span><span class="pln">httpParams</span><span class="pun">);</span><span class="pln">
  
        </span><span class="kwd">return</span><span class="pln"> httpClient</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span>

上述代码的loadData方法中,创建一个AsyncTask对象,在对象的doInBackground方法中发起网络操作,获取到操作结果。然后在onPostExecute方法中,利用前面获取到的结果更新界面。

这里的网络操作主要是利用了HttpClient等相关api,位于org.apache.http.client.HttpClient下。

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

登录

注册