HTTP数据传输和WebView的使用
关于android的Web的一些小知识:
1) HTTP数据通讯--GET和POST的使用
2) WebView--迅速的创建一个Web浏览器,虽然不是轻量级的,但是很容易的可以创建一个浏览器,也不失为一个学习的内容。
-------------------------------------------------------------------------------------------------
GET的使用:
// Android 调用 http 协议的 get 方法
// 本例:以 http 协议的 get 方法获取远程页面响应的内容
private void httpGetDemo(){
try {
// 模拟器测试时,请使用外网地址--这里使用了内网的地址
URL url = new URL("http://192.168.137.57/test.txt");
//建立一个连接
URLConnection con = url.openConnection();
String result = "http status code: " + ((HttpURLConnection)con).getResponseCode() + "\n";
// HttpURLConnection.HTTP_OK---连接成功
if (HttpURLConnection.HTTP_OK != ((HttpURLConnection)con).getResponseCode())
{
Log.i("Main", "connection failed");
return;
}
//连接到一个连接服务端的输出流
InputStream is = con.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
ByteArrayBuffer bab = new ByteArrayBuffer(32);
int current = 0;
while ( (current = bis.read()) != -1 ){
bab.append((byte)current);
}
// EncodingUtils----apache的一个方法---
// The home for utility methods that handle various encoding tasks.
result += EncodingUtils.getString(bab.toByteArray(), HTTP.UTF_8);
bis.close();
is.close();
//把得到的Response数据+txt文件流的数据设置到textView中
textView.setText(result);
} catch (Exception e) {
textView.setText(e.toString());
}
}
POST的使用:
// Android 调用 http 协议的 post 方法
// 本例:以 http 协议的 post 方法向远程页面传递参数,并获取其响应的内容
private void httpPostDemo(){
try {
// 模拟器测试时,请使用外网地址
String url = "http://192.168.137.57/test.txt";
//定义个map存储键值对
Map<String, String> data = new HashMap<String, String>();
data.put("name", "webabcd");
data.put("salary", "100");
//new 一个客户端
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
//把键值对数据放入list中
ArrayList<BasicNameValuePair> postData = new ArrayList<BasicNameValuePair>();
for (Map.Entry<String, String> m : data.entrySet()) {
postData.add(new BasicNameValuePair(m.getKey(), m.getValue()));
}
//
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(postData, HTTP.UTF_8);
httpPost.setEntity(entity);
HttpResponse response = httpClient.execute(httpPost);
String result = "http status code: " + response.getStatusLine().getStatusCode() + "\n";
// HttpURLConnection.HTTP_OK
if (HttpURLConnection.HTTP_OK != response.getStatusLine().getStatusCode())
{
Log.i("Main", "connection failed");
return;
}
HttpEntity httpEntity = response.getEntity();
InputStream is = httpEntity.getContent();
result += convertStreamToString(is);
textView.setText(result);
} catch (Exception e) {
textView.setText(e.toString());
}
}
------------------------------------------------------------------------------------------------
下面介绍WebView的一个重要的方法
webview.loadUrl()
a) 加载某个网页
b) 调用网页里的某个JS方法
--------------------------------------------------------------------------------------------------
我们要实现的功能很简单,通过WebView加载一个本地的html网页
实现网页和活动交互。
1.活动到网页的交互
mWebView = (WebView) findViewById(R.id.wv);
mWebView.loadUrl(LOCAL_URL);
btn.setOnClickListener(new OnClickListener()
{
public void onClick(View arg0)
{
//得到输入框中的内容
String inputStr = txt.getText().toString();
//通过.loadUrl("js命令")实现数据的传输,可以通过一个div标签显示输入框中的内容
mWebView.loadUrl("javascript:get4Android('" + inputStr + "')");
}
});
webview一些属性需要设置:
//得到WebSetting对象对WebView进行设置
WebSettings webSettings = mWebView.getSettings();
// 设置支持js
webSettings.setJavaScriptEnabled(true);
// 给webview设置一个client使当前 webview作为一个独立的浏览器使用,需要定义一个实现WebViewClient的类MyWebViewClient。
mWebView.setWebViewClient(new MyWebViewClient());
// 使页面获得焦点
mWebView.requestFocus();
2.网页到活动的交互
a)活动绑定js的方法:--两者通过theKey来作为接口
mWebView.addJavascriptInterface(new runJavaScript(), "theKey");
b)自己定义的一个内部类----js异步的通过h(handler对象)来刷新活动中的数据
private final class runJavaScript
{
public void runOnAndroidJavaScript(final String str)
{
h.post(new Runnable()
{
// @Override
public void run()
{
TextView show = (TextView) findViewById(R.id.show);
show.setText("This is a message from javascript:" + str);
}
});
}
}
c)JS通过theKey来传递数据
window.theKey.runOnAndroidJavaScript(str);
--------------------------------------------------------------------------------------------------
总结如下:
WebView与JS
接口:
a) 本地组件向网页传递数据
1. URL
2. JS方法名 + 参数
b) 网页向本地组件传递数据
1. interfaceName The name to used to expose the class in Javascript
2. java代码中interfaceName对应的方法名和参数
这里只是写了一些课堂的笔记,如果大家想深入的了解代码可以给我留言。打完收工,可以睡觉了。。。。。。。。。