利用android-async-http开源项目实现网络代码查看器

1.      导入android-async-http开源项目的最新版本的jar

android-async-http-1.4.4.jar

2.      网络源代码查看器的界面搭建,如:

利用android-async-http开源项目实现网络代码查看器_第1张图片

         使用到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.      测试解析:

利用android-async-http开源项目实现网络代码查看器_第2张图片

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

例如:(下图自己创建的编码)

利用android-async-http开源项目实现网络代码查看器_第3张图片
通过浏览器看到的头信息为GBK

 

因此,我们需要添加不同情况的头信息,以便于不同的头信息都可以获取。

 

此外,html4html5相应的区别:

当头信息content-type没有编码信息的时候,我们需要查看响应来获取我们所需要的编码。这也就是html5html4的区别。我们需要根据<meta>信息进行解析。

利用android-async-http开源项目实现网络代码查看器_第4张图片

利用android-async-http开源项目实现网络代码查看器_第5张图片

你可能感兴趣的:(利用android-async-http开源项目实现网络代码查看器)