本文主要讲述如何通过HttpClient来访问网页内容。
1. 搭建web服务器环境:php+mySQL+apache,可以参考:关于Apache+MySQL+PHP在windows平台的整合
2. 测试访问局域网的web网页,需要在AndroidManifest.xml中添加internet权限:
<uses-permission android:name="android.permission.INTERNET"/>
3.解析来自web server的JSON数据
package json.http.andy; /* * @author:andy * @date:2012.5.18 * Description:Demo to parse json from web server. * */ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import org.apache.http.*; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; import org.apache.http.params.HttpProtocolParams; import org.apache.http.util.EntityUtils; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; public class HttpClientActivity extends Activity { private static final String TAG = "HTTPCLIENT"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.httpclient); final TextView tv = (TextView)this.findViewById(R.id.textView_HTTPClient); //http address String httpurl = "http://10.0.2.2"; //定义Http Get请求 final HttpGet httpRequest = new HttpGet(httpurl); //准备参数设置 HttpParams params = new BasicHttpParams(); //连接超时 HttpConnectionParams.setConnectionTimeout(params, 60*1000); //Socket Timeout HttpConnectionParams.setSoTimeout(params, 60*1000); //Socket Buffer Size HttpConnectionParams.setSocketBufferSize(params, 8192);//8K //Redirecting to true //HttpClientParams.setRedirecting(params, true); HttpProtocolParams.setUserAgent(params, ACTIVITY_SERVICE); //使用参数实例化HttpClient final HttpClient httpclient = new DefaultHttpClient(); Log.v(TAG,"get httpclient"); Thread getThread = new Thread() { @Override public void run() { try { //执行Get请求,返回结果在httpResponse中 HttpResponse httpResponse = httpclient.execute(httpRequest); Log.v(TAG,"creat http response object"); Log.v(TAG,"Response code:"+httpResponse.getStatusLine().getStatusCode()); if(httpResponse.getStatusLine().getStatusCode()==HttpStatus.SC_OK) { Log.v(TAG,"get result"); final String resultData = EntityUtils.toString(httpResponse.getEntity()); if(resultData != "") { Log.v(TAG,"result:"+resultData); //tv.setText(resultData);//不能在UI线程之外刷UI //可以这样刷 tv.post(new Runnable() { public void run() { tv.setText(resultData); } }); // Parse the JSON data. try { String text = ""; JSONArray jArray = new JSONArray(resultData); for (int i = 0; i < jArray.length(); i++) { JSONObject json_data = jArray.getJSONObject(i); text += "id: " + json_data.getInt("id") + ", name: " + json_data.getString("name") + ", age: " + json_data.getInt("age") + ", homeaddr: " + json_data.getString("homeaddr")+"\n"; } Log.v(TAG,text); } catch (JSONException ex) { Log.e(TAG,"Error parsing JSON data: " + ex.toString()); } } else { Log.e(TAG,"未读取到网页内容."); } } else { httpResponse = null; httpRequest.abort(); interrupted(); } } catch (ClientProtocolException e) { Log.e(TAG,"ClientProtocolException"); httpRequest.abort(); interrupted(); } catch (IOException e) { Log.e(TAG, "IOException"); httpRequest.abort(); interrupted(); } catch (Exception e) { Log.e(TAG, "Exception"); httpRequest.abort(); interrupted(); } finally { if(httpclient != null ) { httpclient.getConnectionManager().shutdown(); } } } }; getThread.start(); //注意这里同样的R.id.Button_Back在不同的Activity中被注册成不同的功能 Button button_back = (Button)findViewById(R.id.Button_Back); button_back.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(HttpClientActivity.this,HttpActivity.class); startActivity(intent); HttpClientActivity.this.finish(); } }); } }
得到结果显示如下(内容为php包装的JSON对象):
附上web的源代码 index.php:
<?php $conn = mysql_connect("localhost"); $t = mysql_select_db("test",$conn); $q=mysql_query("SELECT * FROM staff",$conn); while($e=mysql_fetch_assoc($q)) $output[]=$e; print(json_encode($output)); mysql_close($conn); ?>
可以看出,我们如果需要访问远程数据接口,妥善的办法还是通过Web Server来访问数据库接口。
但是当把URL改成 http://www.google.com.hk/ 等internet网址时却出现无响应的情况,应该是超时所致,接下来我们来解决这个问题。
//分析下来,是由于公司网络必须设置proxy才能访问外网导致,因此增加proxy设置,解决此问题。
//设置代理 HttpHost proxy = new HttpHost("your proxy", 8888); httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY,proxy); //执行Get请求,返回结果在httpResponse中 HttpResponse httpResponse = httpclient.execute(httpRequest);