Android学习笔记:利用httpclient和AsyncTask 发起网络http post操作
1、在android4中,发起网络http操作,不能在Activity的事件(即主线程)中进行,必须在单独的线程中操作。
另外进行网络操作,需要在manifest文件中增加如下的权限:
<uses-permission android:name="android.permission.INTERNET" />
2、下面给出代码事例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | public void loadData() { new AsyncTask<String, Void, String>() { @Override protected String doInBackground(String... paramsInput) { String url = "http://10.0.0.5:8080/examples/action" ; List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add( new BasicNameValuePair( "type" , paramsInput[ 0 ])); params.add( new BasicNameValuePair( "id" , paramsInput[ 1 ])); /* 建立HTTPPost对象 */ HttpPost httpRequest = new HttpPost(url); String strResult = "doPostError" ; try { HttpClient httpClient = getHttpClient(); /* 添加请求参数到请求对象 */ httpRequest.setEntity( new UrlEncodedFormEntity(params, HTTP.UTF_8)); /* 发送请求并等待响应 */ HttpResponse httpResponse = httpClient.execute(httpRequest); /* 若状态码为200 ok */ if (httpResponse.getStatusLine().getStatusCode() == 200 ) { /* 读返回数据 */ strResult = EntityUtils.toString(httpResponse .getEntity()); } else { strResult = "Error Response: " + httpResponse.getStatusLine().toString(); } } catch (ClientProtocolException e) { strResult = "Error Response: " + e.getMessage().toString(); e.printStackTrace(); } catch (IOException e) { strResult = "Error Response: " + e.getMessage().toString(); e.printStackTrace(); } catch (Exception e) { strResult = "Error Response: " + e.getMessage().toString(); e.printStackTrace(); } return strResult; } @Override protected void onPostExecute(String result) { TextView view = (TextView) findViewById(R.id.resultText); view.setText(result); super .onPostExecute(result); } }.execute( "query" , "1" ); } private HttpClient getHttpClient() { // 创建 HttpParams 以用来设置 HTTP 参数(这一部分不是必需的) HttpParams httpParams = new BasicHttpParams(); // 设置连接超时和 Socket 超时,以及 Socket 缓存大小 HttpConnectionParams.setConnectionTimeout(httpParams, 20 * 1000 ); HttpConnectionParams.setSoTimeout(httpParams, 20 * 1000 ); HttpConnectionParams.setSocketBufferSize(httpParams, 8192 ); // 设置重定向,缺省为 true HttpClientParams.setRedirecting(httpParams, true ); // 设置 user agent String userAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2) Gecko/20100115 Firefox/3.6" ; HttpProtocolParams.setUserAgent(httpParams, userAgent); // 创建一个 HttpClient 实例 // 注意 HttpClient httpClient = new HttpClient(); 是Commons HttpClient // 中的用法,在 Android 1.5 中我们需要使用 Apache 的缺省实现 DefaultHttpClient HttpClient httpClient = new DefaultHttpClient(httpParams); return httpClient; } |
上述代码的loadData方法中,创建一个AsyncTask对象,在对象的doInBackground方法中发起网络操作,获取到操作结果。然后在onPostExecute方法中,利用前面获取到的结果更新界面。
这里的网络操作主要是利用了HttpClient等相关api,位于org.apache.http.client.HttpClient下。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步