android 网络_网络源码查看器

xml设计

<?xml version="1.0"?>

-<LinearLayout tools:context=".MainActivity" android:paddingTop="@dimen/activity_vertical_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingBottom="@dimen/activity_vertical_margin" android:orientation="vertical" android:layout_height="match_parent" android:layout_width="match_parent" xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android">

<EditText android:id="@+id/et_url" android:layout_height="wrap_content" android:layout_width="fill_parent" android:text="http://www.baidu.com"/>

<Button android:id="@+id/bt_looksource" android:layout_height="wrap_content" android:layout_width="fill_parent" android:text="查看源码"/>


-<ScrollView android:layout_height="wrap_content" android:layout_width="wrap_content">

<TextView android:id="@+id/tv_source" android:layout_height="match_parent" android:layout_width="match_parent"/>

</ScrollView>

</LinearLayout>
几个控件

 

 

java

package com.itheima.sourcelook;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.app.Activity;
import android.content.Context;
import android.text.TextUtils;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity  implements OnClickListener{

    private EditText et_url;
    private TextView tv_source;
    private Context mContext;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext =this;
        et_url = (EditText) findViewById(R.id.et_url);
        Button bt_looksource = (Button) findViewById(R.id.bt_looksource);
        tv_source = (TextView) findViewById(R.id.tv_source);
        
        //二.设置点击事件
        bt_looksource.setOnClickListener(this);
    
        System.out.println("oncreate方法线程:"+Thread.currentThread().getName());
        
    }

    //☆☆☆1.在主线程中创建一个Handler对象
    private Handler handler = new Handler(){
        //☆☆☆2.重写handler的handlermessage方法,用来接收子线程中发来的消息
        public void handleMessage(android.os.Message msg) {
            //☆☆☆5.接收子线程发送的数据,处理数据。
            String result  = (String) msg.obj;
            //☆☆☆6.当前方法属于主线程可以做UI的更新
            //五.获取服务器返回的内容,显示到textview上
                tv_source.setText(result);
        };
    };
    
    @Override
    public void onClick(View v) {
        
        
        try{
        //三.oclick方法中获取用户输入的url地址
        final String url_str = et_url.getText().toString().trim();
        if(TextUtils.isEmpty(url_str)){
            Toast.makeText(mContext, "url不能为空", 0).show();
            return ;
        }
        
        System.out.println("oclick方法线程:"+Thread.currentThread().getName());
        
        
        //创建一个子线程做网络请求
        new Thread(new Runnable() {
            
            @Override
            public void run() {
                try{
                    System.out.println("oclick方法runnable线程:"+Thread.currentThread().getName());
                    
                    
                //四.请求url地址
                //1.创建一个Url对象
                    URL url = new URL(url_str);
                //2.获取一个UrlConnection对象
                    HttpURLConnection connection = (HttpURLConnection)url.openConnection();
                //3.为UrlConnection对象设置一些请求的参数,请求方式,连接的超时时间 
                    connection.setRequestMethod("GET");//设置请求方式
                    connection.setConnectTimeout(1000*10);//设置超时时间
                    
                    
                //4.在获取url请求的数据前需要判断响应码,200 :成功,206:访问部分数据成功   300:跳转或重定向  400:错误 500:服务器异常
                    int code = connection.getResponseCode();
                    if(code == 200){
                //5.获取有效数据,并将获取的流数据解析成String
                        InputStream inputStream = connection.getInputStream();
                        String result = StreamUtils.streamToString(inputStream);
                        
                        //☆☆☆3.子线中创建一个Message对象,为了携带子线程中获取的数据给主线程。
                        Message msg = new Message();
                        msg.obj = result;//将获取的数据封装到msg中。
                        //☆☆☆4.使用handler对象将message发送到主线程。
                        handler.sendMessage(msg);
            
                        
                    }
                    
                }catch (Exception e) {
                    e.printStackTrace();
                }
                
            }
        }).start();
        
        
                
        }catch (Exception e) {
            e.printStackTrace();
        }
    }


}
MainActivity

 

package com.itheima.sourcelook;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;

public class StreamUtils {


    public static String streamToString(InputStream  in){
        String result ="";

        try{
            //创建一个字节数组写入流
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            
            byte[] buffer = new byte[1024];
            int length = 0;
            while (  (length =  in.read(buffer)) !=-1) {
                out.write(buffer, 0, length);
                out.flush();
            }
            
            result = out.toString();//将字节流转换成string
            
            out.close();
        }catch (Exception e) {
            e.printStackTrace();
        }


        return result;
    }
}
StreamUtils--包--字节--字符串

 

老师笔记

# 01 网络html源码查看器
    
    访问网络需要加Internet权限:
    android.permission.INTERNET

        
    使用UrlConnection请求一个url地址获取内容:

            //1.创建一个Url对象
                URL url = new URL(url_str);
            //2.获取一个UrlConnection对象
                HttpURLConnection connection = (HttpURLConnection)url.openConnection();
            //3.为UrlConnection对象设置一些请求的参数,请求方式,连接的超时时间
                connection.setRequestMethod("GET");//设置请求方式
                connection.setConnectTimeout(1000*10);//设置超时时间
            //4.在获取url请求的数据前需要判断响应码,200 :成功,206:访问部分数据成功   300:跳转或重定向  400:错误 500:服务器异常
                int code = connection.getResponseCode();
                if(code == 200){
            //5.获取有效数据,并将获取的流数据解析成String
                    InputStream inputStream = connection.getInputStream();
                    String result = StreamUtils.streamToString(inputStream);
    


    注意事项:
        
        1. ANR:application not response 应用无响应; androoid中耗时的操作(请求网络,大文件的拷贝,数据库的操作)需要在子线程中做。
        09-02 01:52:40.711: E/ActivityManager(857): ANR in com.itheima.sourcelook (com.itheima.sourcelook/.MainActivity)

        2. 4.0后网络操作强制在子线程中进行。因为网络访问是耗时的操作,可能会导致ANR
        09-02 01:57:32.879: W/System.err(1789):  android.os.NetworkOnMainThreadException

        3.错误线程调用异常,子线程不能够更新UI(控件的内容)
            09-02 02:02:08.873: W/System.err(1858): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

    
        主线程不能够做耗时的操作,网络请求就是耗时的操作需要放到子线程做。子线程不能更新控件的内容(更新Ui)。所以产生了矛盾,解决办法就是使用Handler.

posted @ 2016-07-22 16:55  Qi_Yuan  阅读(641)  评论(0编辑  收藏  举报