1. 导入android-async-http开源项目的最新版本的jar包
android-async-http-1.4.4.jar
2. 网络源代码查看器的界面搭建,如:
使用到Scrollbars的标签进行页面布局
<ScrollView
android:id="@+id/scrollView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
android:layout_below="@+id/btn_code" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_code"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/tv_code" />
</LinearLayout>
</ScrollView>
3. 添加网络权限
<uses-permissionandroid:name="android.permission.INTERNET"/>
4. 判断网络地址是否为空
5. 如果不为空时则利用AsyncHttpClient创建异步客户端对象
6. 处理get/post请求
7. 如果成功的话,设置显示的内容:
1) 获取文件响应的编码类型(保证无乱码现象):
① 遍历头信息获取contentType_value内容
② 定义服务器的缺省的编码方式
③ 处理contentType_value值来获取编码方式:
a) contentType_value是否为”=”;
b) contentType_value是否为空;
2) 根据服务器返回的编码给显示内容编码值。
8. 测试解析:
package www.csdn.net.lesson06;
import java.io.UnsupportedEncodingException;
import org.apache.http.Header;
import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
public class MainActivity extends Activity {
// 声明控件
private EditText et_url;
private TextView tv_code;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取控件对象
et_url = (EditText) findViewById(R.id.et_url);
tv_code = (TextView) findViewById(R.id.tv_code);
}
public void sendHttpUrl(View v) {
int id = v.getId();
switch (id) {
case R.id.btn_code:
// 获取网络路径
String url = et_url.getText().toString();
if (TextUtils.isEmpty(url)) {
Toast.makeText(this, "网页地址不能为空", Toast.LENGTH_LONG).show();
} else {
// 创建客户端对象
AsyncHttpClient client = new AsyncHttpClient();
// 执行get方法
client.get(url, new AsyncHttpResponseHandler() {
@Override
public void onFailure(int statusCode, Header[] headers,
byte[] responseBody, Throwable error) {
error.printStackTrace();
}
@Override
public void onSuccess(int statusCode, Header[] headers,
byte[] responseBody) {
// 获取文件响应类型
String contentType_value = null;
// 遍历所有头信息
for (Header header : headers) {
// 判断头信息是否有Content-Type
if (header.getName().equals("Content-Type")) {
// 获取value值
contentType_value = header.getValue();
}
}
// 定义服务器端的缺省编码方式
String default_charset = "UTF-8";
if (contentType_value != null) {
if (contentType_value.contains("=")) {
int index = contentType_value.indexOf("=");
default_charset = contentType_value.substring(
index + 1, contentType_value.length());
}else {
//获取网页内容
String result = new String(responseBody);
default_charset = getCharset(result);
}
}else {
String result = new String(responseBody);
default_charset = getCharset(result);
}
Toast.makeText(MainActivity.this,
"编码是:" + default_charset, Toast.LENGTH_LONG)
.show();
if (statusCode == 200) {
try {
String result = new String(responseBody,
default_charset);
tv_code.setText(result);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* 获取网页内容的默认编码
* <meta标签中的信息>
* @return
*/
private String getCharset(String result) {
String defaultCharset = null;
if (result != null) {
if (result.contains("content=\"text/html;charset=GBK\"")) {
defaultCharset = "GBK";
}else if (result.contains("content=\"text/html;charset=utf-8\"")) {
defaultCharset = "utf-8";
}else if (result.contains("content=\"text/html;charset=GB2312\"")) {
defaultCharset = "GB2312";
}else if(result.contains("charset=\"UTF-8\"")){
defaultCharset = "UTF-8";
}else if(result.contains("charset=\"GBK\"")){
defaultCharset = "GBK";
}else if(result.contains("content=\"text/html;charset=UTF-8\"")){
defaultCharset = "UTF-8";
}
}
return defaultCharset;
}
});
}
break;
}
}
}
问题:但是并不是所有的网页都想百度一样编码是:utf-8
例如:(下图自己创建的编码)
通过浏览器看到的头信息为GBK
因此,我们需要添加不同情况的头信息,以便于不同的头信息都可以获取。
此外,html4和html5相应的区别:
当头信息content-type没有编码信息的时候,我们需要查看响应来获取我们所需要的编码。这也就是html5和html4的区别。我们需要根据<meta>信息进行解析。