Android使用HttpClient方法和易错有关问题
Android使用HttpClient方法和易错问题
HttpClient为Android开发者提供了跟简洁的操作Http网络连接的方法,在连接过程中也有两种方式,get和post,先看一下如何实现的
默认是get方式
//先将参数放入List,再对参数进行URL编码 List<BasicNameValuePair> params = new LinkedList<BasicNameValuePair>(); params.add(new BasicNameValuePair("param1", "中国")); params.add(new BasicNameValuePair("param2", "value2")); //baseUrl String baseUrl = "http://www.baidu.com"; //将URL与参数拼接 HttpGet getMethod = new HttpGet(baseUrl + "?" + param); HttpClient httpClient = new DefaultHttpClient(); try { HttpResponse response = httpClient.execute(getMethod); //发起GET请求 Log.i(TAG, "resCode = " + response.getStatusLine().getStatusCode()); //获取响应码 Log.i(TAG, "result = " + EntityUtils.toString(response.getEntity(), "utf-8"));//获取服务器响应内容 } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
post方式
//和GET方式一样,先将参数放入List params = new LinkedList<BasicNameValuePair>(); params.add(new BasicNameValuePair("param1", "Post方法")); params.add(new BasicNameValuePair("param2", "第二个参数")); try { HttpPost postMethod = new HttpPost(baseUrl); postMethod.setEntity(new UrlEncodedFormEntity(params, "utf-8")); //将参数填入POST Entity中 HttpResponse response = httpClient.execute(postMethod); //执行POST方法 Log.i(TAG, "resCode = " + response.getStatusLine().getStatusCode()); //获取响应码 Log.i(TAG, "result = " + EntityUtils.toString(response.getEntity(), "utf-8")); //获取响应内容 } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }如果需要在获得网络资源后,去更新UI的一些东西,需要使用异步的方式,否则会发生错误
Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == 0x123) { tv.setText(result); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView) findViewById(R.id.tv); result = ""; final HttpClient httpclient = new DefaultHttpClient(); new Thread() { public void run() { HttpGet httpRequest = new HttpGet( "http://www.baidu.com"); try { HttpResponse httpResponse = httpclient.execute(httpRequest); if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { // 取得返回的字符串 result = EntityUtils.toString(httpResponse.getEntity()); //tv.setText(result);//如果在这里来使用会报错 Message msg = new Message(); msg.what = 0x123; handler.sendMessage(msg); } } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }.start(); }
- 2楼oSanYeCao1234567昨天 15:18
- 不能在子线程中更新UI组件
- 1楼BuleRiver昨天 14:43
- 易错问题是哪些呢?
- Re: zpf8861昨天 14:52
- 回复BuleRivern这个操作没几步就完成了,一个是ui进程不是异步进行的,还有配置文件加上INTENET那个权限,应该就没有问题了