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
例如:(下图自己创建的编码)
因此,我们需要添加不同情况的头信息,以便于不同的头信息都可以获取。
此外,html4和html5相应的区别:
当头信息content-type没有编码信息的时候,我们需要查看响应来获取我们所需要的编码。这也就是html5和html4的区别。我们需要根据<meta>信息进行解析。